├── .firebaserc
├── .github
├── CODEOWNERS
├── PULL_REQUEST_TEMPLATE.md
└── workflows
│ ├── authentication_repository.yaml
│ ├── geometry.yaml
│ ├── leaderboard_repository.yaml
│ ├── main.yaml
│ ├── pinball_audio.yaml
│ ├── pinball_components.yaml
│ ├── pinball_flame.yaml
│ ├── pinball_theme.yaml
│ ├── pinball_ui.yaml
│ ├── platform_helper.yaml
│ ├── share_repository.yaml
│ └── spell_check.yaml
├── .gitignore
├── .idea
└── runConfigurations
│ └── main.xml
├── .metadata
├── .vscode
├── cspell.json
├── extensions.json
└── launch.json
├── LICENSE
├── README.md
├── analysis_options.yaml
├── art
└── readme_header.png
├── assets
└── images
│ ├── bonus_animation
│ ├── android_spaceship.png
│ ├── dash_nest.png
│ ├── dino_chomp.png
│ ├── google_word.png
│ └── sparky_turbo_charge.png
│ ├── components
│ ├── key.png
│ └── space.png
│ ├── loading_game
│ └── io_pinball.png
│ └── score
│ └── mini_score_background.png
├── coverage_badge.svg
├── firebase.json
├── firestore.rules
├── functions
├── .gitignore
├── index.js
├── package-lock.json
└── package.json
├── l10n.yaml
├── lib
├── app
│ ├── app.dart
│ └── view
│ │ └── app.dart
├── assets_manager
│ ├── assets_manager.dart
│ ├── cubit
│ │ ├── assets_manager_cubit.dart
│ │ └── assets_manager_state.dart
│ └── views
│ │ ├── assets_loading_page.dart
│ │ └── views.dart
├── bootstrap.dart
├── game
│ ├── behaviors
│ │ ├── animatronic_looping_behavior.dart
│ │ ├── ball_spawning_behavior.dart
│ │ ├── behaviors.dart
│ │ ├── bonus_ball_spawning_behavior.dart
│ │ ├── bonus_noise_behavior.dart
│ │ ├── bumper_noise_behavior.dart
│ │ ├── camera_focusing_behavior.dart
│ │ ├── character_selection_behavior.dart
│ │ ├── cow_bumper_noise_behavior.dart
│ │ ├── kicker_noise_behavior.dart
│ │ ├── rollover_noise_behavior.dart
│ │ └── scoring_behavior.dart
│ ├── bloc
│ │ ├── game_bloc.dart
│ │ ├── game_event.dart
│ │ └── game_state.dart
│ ├── components
│ │ ├── android_acres
│ │ │ ├── android_acres.dart
│ │ │ └── behaviors
│ │ │ │ ├── android_spaceship_bonus_behavior.dart
│ │ │ │ ├── behaviors.dart
│ │ │ │ ├── ramp_bonus_behavior.dart
│ │ │ │ ├── ramp_multiplier_behavior.dart
│ │ │ │ ├── ramp_progress_behavior.dart
│ │ │ │ ├── ramp_reset_behavior.dart
│ │ │ │ └── ramp_shot_behavior.dart
│ │ ├── backbox
│ │ │ ├── backbox.dart
│ │ │ ├── bloc
│ │ │ │ ├── backbox_bloc.dart
│ │ │ │ ├── backbox_event.dart
│ │ │ │ └── backbox_state.dart
│ │ │ └── displays
│ │ │ │ ├── displays.dart
│ │ │ │ ├── game_over_info_display.dart
│ │ │ │ ├── initials_input_display.dart
│ │ │ │ ├── initials_submission_failure_display.dart
│ │ │ │ ├── initials_submission_success_display.dart
│ │ │ │ ├── leaderboard_display.dart
│ │ │ │ ├── leaderboard_failure_display.dart
│ │ │ │ ├── loading_display.dart
│ │ │ │ └── share_display.dart
│ │ ├── bottom_group.dart
│ │ ├── components.dart
│ │ ├── dino_desert
│ │ │ ├── behaviors
│ │ │ │ ├── behaviors.dart
│ │ │ │ └── chrome_dino_bonus_behavior.dart
│ │ │ └── dino_desert.dart
│ │ ├── drain
│ │ │ ├── behaviors
│ │ │ │ ├── behaviors.dart
│ │ │ │ └── draining_behavior.dart
│ │ │ └── drain.dart
│ │ ├── flutter_forest
│ │ │ ├── behaviors
│ │ │ │ ├── behaviors.dart
│ │ │ │ └── flutter_forest_bonus_behavior.dart
│ │ │ └── flutter_forest.dart
│ │ ├── game_bloc_status_listener.dart
│ │ ├── google_gallery
│ │ │ ├── behaviors
│ │ │ │ ├── behaviors.dart
│ │ │ │ └── google_word_bonus_behavior.dart
│ │ │ └── google_gallery.dart
│ │ ├── launcher.dart
│ │ ├── multiballs
│ │ │ ├── behaviors
│ │ │ │ ├── behaviors.dart
│ │ │ │ └── multiballs_behavior.dart
│ │ │ └── multiballs.dart
│ │ ├── multipliers
│ │ │ ├── behaviors
│ │ │ │ ├── behaviors.dart
│ │ │ │ └── multipliers_behavior.dart
│ │ │ └── multipliers.dart
│ │ └── sparky_scorch
│ │ │ ├── behaviors
│ │ │ ├── behaviors.dart
│ │ │ └── sparky_computer_bonus_behavior.dart
│ │ │ └── sparky_scorch.dart
│ ├── game.dart
│ ├── game_assets.dart
│ ├── pinball_game.dart
│ └── view
│ │ ├── pinball_game_page.dart
│ │ ├── view.dart
│ │ └── widgets
│ │ ├── bonus_animation.dart
│ │ ├── game_hud.dart
│ │ ├── mobile_controls.dart
│ │ ├── mobile_dpad.dart
│ │ ├── play_button_overlay.dart
│ │ ├── replay_button_overlay.dart
│ │ ├── round_count_display.dart
│ │ ├── score_view.dart
│ │ └── widgets.dart
├── gen
│ ├── assets.gen.dart
│ └── gen.dart
├── how_to_play
│ ├── how_to_play.dart
│ └── widgets
│ │ ├── how_to_play_dialog.dart
│ │ └── widgets.dart
├── l10n
│ ├── arb
│ │ └── app_en.arb
│ └── l10n.dart
├── leaderboard
│ └── models
│ │ └── leader_board_entry.dart
├── main.dart
├── more_information
│ ├── more_information.dart
│ └── more_information_dialog.dart
├── select_character
│ ├── cubit
│ │ ├── character_theme_cubit.dart
│ │ └── character_theme_state.dart
│ ├── select_character.dart
│ └── view
│ │ ├── character_selection_page.dart
│ │ ├── selected_character.dart
│ │ └── view.dart
└── start_game
│ ├── bloc
│ ├── start_game_bloc.dart
│ ├── start_game_event.dart
│ └── start_game_state.dart
│ ├── start_game.dart
│ └── widgets
│ └── start_game_listener.dart
├── packages
├── authentication_repository
│ ├── .gitignore
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── authentication_repository.dart
│ │ └── src
│ │ │ └── authentication_repository.dart
│ ├── pubspec.yaml
│ └── test
│ │ └── src
│ │ └── authentication_repository_test.dart
├── geometry
│ ├── .gitignore
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── geometry.dart
│ │ └── src
│ │ │ └── geometry.dart
│ ├── pubspec.yaml
│ └── test
│ │ └── src
│ │ └── geometry_test.dart
├── leaderboard_repository
│ ├── .gitignore
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── leaderboard_repository.dart
│ │ └── src
│ │ │ ├── leaderboard_repository.dart
│ │ │ └── models
│ │ │ ├── exceptions.dart
│ │ │ ├── leaderboard_entry_data.dart
│ │ │ ├── leaderboard_entry_data.g.dart
│ │ │ └── models.dart
│ ├── pubspec.yaml
│ └── test
│ │ └── src
│ │ ├── leaderboard_repository_test.dart
│ │ └── models
│ │ └── leaderboard_entry_data_test.dart
├── pinball_audio
│ ├── .gitignore
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── assets
│ │ ├── music
│ │ │ └── background.mp3
│ │ └── sfx
│ │ │ ├── android.mp3
│ │ │ ├── bumper_a.mp3
│ │ │ ├── bumper_b.mp3
│ │ │ ├── cow_moo.mp3
│ │ │ ├── dash.mp3
│ │ │ ├── dino.mp3
│ │ │ ├── flipper.mp3
│ │ │ ├── game_over_voice_over.mp3
│ │ │ ├── google.mp3
│ │ │ ├── io_pinball_voice_over.mp3
│ │ │ ├── kicker_a.mp3
│ │ │ ├── kicker_b.mp3
│ │ │ ├── launcher.mp3
│ │ │ ├── rollover.mp3
│ │ │ └── sparky.mp3
│ ├── lib
│ │ ├── gen
│ │ │ └── assets.gen.dart
│ │ ├── pinball_audio.dart
│ │ └── src
│ │ │ └── pinball_audio.dart
│ ├── pubspec.yaml
│ └── test
│ │ └── src
│ │ └── pinball_audio_test.dart
├── pinball_components
│ ├── .gitignore
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── assets
│ │ └── images
│ │ │ ├── android
│ │ │ ├── bumper
│ │ │ │ ├── a
│ │ │ │ │ ├── dimmed.png
│ │ │ │ │ └── lit.png
│ │ │ │ ├── b
│ │ │ │ │ ├── dimmed.png
│ │ │ │ │ └── lit.png
│ │ │ │ └── cow
│ │ │ │ │ ├── dimmed.png
│ │ │ │ │ └── lit.png
│ │ │ ├── rail
│ │ │ │ ├── exit.png
│ │ │ │ └── main.png
│ │ │ ├── ramp
│ │ │ │ ├── arrow
│ │ │ │ │ ├── active1.png
│ │ │ │ │ ├── active2.png
│ │ │ │ │ ├── active3.png
│ │ │ │ │ ├── active4.png
│ │ │ │ │ ├── active5.png
│ │ │ │ │ └── inactive.png
│ │ │ │ ├── board_opening.png
│ │ │ │ ├── main.png
│ │ │ │ ├── railing_background.png
│ │ │ │ └── railing_foreground.png
│ │ │ └── spaceship
│ │ │ │ ├── animatronic.png
│ │ │ │ ├── light_beam.png
│ │ │ │ └── saucer.png
│ │ │ ├── backbox
│ │ │ ├── button
│ │ │ │ ├── facebook.png
│ │ │ │ └── twitter.png
│ │ │ ├── display_divider.png
│ │ │ ├── display_title_decoration.png
│ │ │ └── marquee.png
│ │ │ ├── ball
│ │ │ └── flame_effect.png
│ │ │ ├── baseboard
│ │ │ ├── left.png
│ │ │ └── right.png
│ │ │ ├── board_background.png
│ │ │ ├── boundary
│ │ │ ├── bottom.png
│ │ │ ├── outer.png
│ │ │ └── outer_bottom.png
│ │ │ ├── dash
│ │ │ ├── animatronic.png
│ │ │ └── bumper
│ │ │ │ ├── a
│ │ │ │ ├── active.png
│ │ │ │ └── inactive.png
│ │ │ │ ├── b
│ │ │ │ ├── active.png
│ │ │ │ └── inactive.png
│ │ │ │ └── main
│ │ │ │ ├── active.png
│ │ │ │ └── inactive.png
│ │ │ ├── dino
│ │ │ ├── animatronic
│ │ │ │ ├── head.png
│ │ │ │ └── mouth.png
│ │ │ ├── bottom_wall.png
│ │ │ ├── top_wall.png
│ │ │ └── top_wall_tunnel.png
│ │ │ ├── display_arrows
│ │ │ ├── arrow_left.png
│ │ │ └── arrow_right.png
│ │ │ ├── error_background.png
│ │ │ ├── flapper
│ │ │ ├── back_support.png
│ │ │ ├── flap.png
│ │ │ └── front_support.png
│ │ │ ├── flipper
│ │ │ ├── left.png
│ │ │ └── right.png
│ │ │ ├── google_rollover
│ │ │ ├── left
│ │ │ │ ├── decal.png
│ │ │ │ └── pin.png
│ │ │ └── right
│ │ │ │ ├── decal.png
│ │ │ │ └── pin.png
│ │ │ ├── google_word
│ │ │ ├── letter1
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── letter2
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── letter3
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── letter4
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── letter5
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ └── letter6
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── kicker
│ │ │ ├── left
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ └── right
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── launch_ramp
│ │ │ ├── background_railing.png
│ │ │ ├── foreground_railing.png
│ │ │ └── ramp.png
│ │ │ ├── multiball
│ │ │ ├── dimmed.png
│ │ │ └── lit.png
│ │ │ ├── multiplier
│ │ │ ├── x2
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── x3
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── x4
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── x5
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ └── x6
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── plunger
│ │ │ ├── plunger.png
│ │ │ └── rocket.png
│ │ │ ├── score
│ │ │ ├── five_thousand.png
│ │ │ ├── one_million.png
│ │ │ ├── twenty_thousand.png
│ │ │ └── two_hundred_thousand.png
│ │ │ ├── signpost
│ │ │ ├── active1.png
│ │ │ ├── active2.png
│ │ │ ├── active3.png
│ │ │ └── inactive.png
│ │ │ ├── skill_shot
│ │ │ ├── decal.png
│ │ │ ├── dimmed.png
│ │ │ ├── lit.png
│ │ │ └── pin.png
│ │ │ ├── slingshot
│ │ │ ├── lower.png
│ │ │ └── upper.png
│ │ │ └── sparky
│ │ │ ├── animatronic.png
│ │ │ ├── bumper
│ │ │ ├── a
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ ├── b
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ └── c
│ │ │ │ ├── dimmed.png
│ │ │ │ └── lit.png
│ │ │ └── computer
│ │ │ ├── base.png
│ │ │ ├── glow.png
│ │ │ └── top.png
│ ├── fonts
│ │ ├── PixeloidMono-1G8ae.ttf
│ │ ├── PixeloidSans-nR3g1.ttf
│ │ └── PixeloidSansBold-RpeJo.ttf
│ ├── lib
│ │ ├── gen
│ │ │ ├── assets.gen.dart
│ │ │ ├── fonts.gen.dart
│ │ │ ├── gen.dart
│ │ │ └── pinball_fonts.dart
│ │ ├── pinball_components.dart
│ │ └── src
│ │ │ ├── components
│ │ │ ├── android_animatronic
│ │ │ │ ├── android_animatronic.dart
│ │ │ │ └── behaviors
│ │ │ │ │ ├── android_animatronic_ball_contact_behavior.dart.dart
│ │ │ │ │ └── behaviors.dart
│ │ │ ├── android_bumper
│ │ │ │ ├── android_bumper.dart
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── android_bumper_ball_contact_behavior.dart
│ │ │ │ │ ├── android_bumper_blinking_behavior.dart
│ │ │ │ │ └── behaviors.dart
│ │ │ │ └── cubit
│ │ │ │ │ ├── android_bumper_cubit.dart
│ │ │ │ │ └── android_bumper_state.dart
│ │ │ ├── android_spaceship
│ │ │ │ ├── android_spaceship.dart
│ │ │ │ └── cubit
│ │ │ │ │ ├── android_spaceship_cubit.dart
│ │ │ │ │ └── android_spaceship_state.dart
│ │ │ ├── arcade_background
│ │ │ │ ├── arcade_background.dart
│ │ │ │ └── cubit
│ │ │ │ │ ├── arcade_background_cubit.dart
│ │ │ │ │ └── arcade_background_state.dart
│ │ │ ├── arrow_icon.dart
│ │ │ ├── ball
│ │ │ │ ├── ball.dart
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── ball_gravitating_behavior.dart
│ │ │ │ │ ├── ball_impulsing_behavior.dart
│ │ │ │ │ ├── ball_scaling_behavior.dart
│ │ │ │ │ ├── ball_turbo_charging_behavior.dart
│ │ │ │ │ └── behaviors.dart
│ │ │ │ └── cubit
│ │ │ │ │ ├── ball_cubit.dart
│ │ │ │ │ └── ball_state.dart
│ │ │ ├── baseboard.dart
│ │ │ ├── board_background_sprite_component.dart
│ │ │ ├── board_dimensions.dart
│ │ │ ├── board_side.dart
│ │ │ ├── boundaries.dart
│ │ │ ├── bumping_behavior.dart
│ │ │ ├── camera_zoom.dart
│ │ │ ├── chrome_dino
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ ├── chrome_dino_chomping_behavior.dart
│ │ │ │ │ ├── chrome_dino_mouth_opening_behavior.dart
│ │ │ │ │ ├── chrome_dino_spitting_behavior.dart
│ │ │ │ │ └── chrome_dino_swiveling_behavior.dart
│ │ │ │ ├── chrome_dino.dart
│ │ │ │ └── cubit
│ │ │ │ │ ├── chrome_dino_cubit.dart
│ │ │ │ │ └── chrome_dino_state.dart
│ │ │ ├── components.dart
│ │ │ ├── dash_animatronic.dart
│ │ │ ├── dash_bumper
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ └── dash_bumper_ball_contact_behavior.dart
│ │ │ │ ├── cubit
│ │ │ │ │ ├── dash_bumpers_cubit.dart
│ │ │ │ │ └── dash_bumpers_state.dart
│ │ │ │ └── dash_bumper.dart
│ │ │ ├── dino_walls.dart
│ │ │ ├── error_component.dart
│ │ │ ├── flapper
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ └── flapper_spinning_behavior.dart
│ │ │ │ └── flapper.dart
│ │ │ ├── flipper
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ ├── flipper_jointing_behavior.dart
│ │ │ │ │ ├── flipper_key_controlling_behavior.dart
│ │ │ │ │ ├── flipper_moving_behavior.dart
│ │ │ │ │ └── flipper_noise_behavior.dart
│ │ │ │ ├── cubit
│ │ │ │ │ ├── flipper_cubit.dart
│ │ │ │ │ └── flipper_state.dart
│ │ │ │ └── flipper.dart
│ │ │ ├── google_letter.dart
│ │ │ ├── google_rollover
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ └── google_rollover_ball_contact_behavior.dart
│ │ │ │ └── google_rollover.dart
│ │ │ ├── google_word
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ └── google_word_animating_behavior.dart
│ │ │ │ ├── cubit
│ │ │ │ │ ├── google_word_cubit.dart
│ │ │ │ │ └── google_word_state.dart
│ │ │ │ └── google_word.dart
│ │ │ ├── initial_position.dart
│ │ │ ├── joint_anchor.dart
│ │ │ ├── kicker
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ ├── kicker_ball_contact_behavior.dart
│ │ │ │ │ └── kicker_blinking_behavior.dart
│ │ │ │ ├── cubit
│ │ │ │ │ ├── kicker_cubit.dart
│ │ │ │ │ └── kicker_state.dart
│ │ │ │ └── kicker.dart
│ │ │ ├── launch_ramp.dart
│ │ │ ├── layer_sensor
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ └── layer_filtering_behavior.dart
│ │ │ │ └── layer_sensor.dart
│ │ │ ├── multiball
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ └── multiball_blinking_behavior.dart
│ │ │ │ ├── cubit
│ │ │ │ │ ├── multiball_cubit.dart
│ │ │ │ │ └── multiball_state.dart
│ │ │ │ └── multiball.dart
│ │ │ ├── multiplier
│ │ │ │ ├── cubit
│ │ │ │ │ ├── multiplier_cubit.dart
│ │ │ │ │ └── multiplier_state.dart
│ │ │ │ └── multiplier.dart
│ │ │ ├── plunger
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ ├── plunger_jointing_behavior.dart
│ │ │ │ │ ├── plunger_key_controlling_behavior.dart
│ │ │ │ │ ├── plunger_noise_behavior.dart
│ │ │ │ │ ├── plunger_pulling_behavior.dart
│ │ │ │ │ └── plunger_releasing_behavior.dart
│ │ │ │ ├── cubit
│ │ │ │ │ ├── plunger_cubit.dart
│ │ │ │ │ └── plunger_state.dart
│ │ │ │ └── plunger.dart
│ │ │ ├── rocket.dart
│ │ │ ├── score_component
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ └── score_component_scaling_behavior.dart
│ │ │ │ └── score_component.dart
│ │ │ ├── signpost
│ │ │ │ ├── cubit
│ │ │ │ │ ├── signpost_cubit.dart
│ │ │ │ │ └── signpost_state.dart
│ │ │ │ └── signpost.dart
│ │ │ ├── skill_shot
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ ├── skill_shot_ball_contact_behavior.dart
│ │ │ │ │ └── skill_shot_blinking_behavior.dart
│ │ │ │ ├── cubit
│ │ │ │ │ ├── skill_shot_cubit.dart
│ │ │ │ │ └── skill_shot_state.dart
│ │ │ │ └── skill_shot.dart
│ │ │ ├── slingshot.dart
│ │ │ ├── spaceship_rail.dart
│ │ │ ├── spaceship_ramp
│ │ │ │ ├── behavior
│ │ │ │ │ ├── behavior.dart
│ │ │ │ │ └── ramp_ball_ascending_contact_behavior.dart
│ │ │ │ ├── cubit
│ │ │ │ │ ├── spaceship_ramp_cubit.dart
│ │ │ │ │ └── spaceship_ramp_state.dart
│ │ │ │ └── spaceship_ramp.dart
│ │ │ ├── sparky_animatronic.dart
│ │ │ ├── sparky_bumper
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ ├── sparky_bumper_ball_contact_behavior.dart
│ │ │ │ │ └── sparky_bumper_blinking_behavior.dart
│ │ │ │ ├── cubit
│ │ │ │ │ ├── sparky_bumper_cubit.dart
│ │ │ │ │ └── sparky_bumper_state.dart
│ │ │ │ └── sparky_bumper.dart
│ │ │ ├── sparky_computer
│ │ │ │ ├── behaviors
│ │ │ │ │ ├── behaviors.dart
│ │ │ │ │ └── sparky_computer_sensor_ball_contact_behavior.dart
│ │ │ │ ├── cubit
│ │ │ │ │ ├── sparky_computer_cubit.dart
│ │ │ │ │ └── sparky_computer_state.dart
│ │ │ │ └── sparky_computer.dart
│ │ │ └── z_indexes.dart
│ │ │ ├── extensions
│ │ │ ├── extensions.dart
│ │ │ └── score.dart
│ │ │ └── pinball_components.dart
│ ├── pubspec.yaml
│ ├── sandbox
│ │ ├── .gitignore
│ │ ├── .metadata
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── analysis_options.yaml
│ │ ├── coverage_badge.svg
│ │ ├── lib
│ │ │ ├── common
│ │ │ │ ├── add_game.dart
│ │ │ │ ├── common.dart
│ │ │ │ ├── games.dart
│ │ │ │ └── trace.dart
│ │ │ ├── main.dart
│ │ │ └── stories
│ │ │ │ ├── android_acres
│ │ │ │ ├── android_bumper_a_game.dart
│ │ │ │ ├── android_bumper_b_game.dart
│ │ │ │ ├── android_bumper_cow_game.dart
│ │ │ │ ├── android_spaceship_game.dart
│ │ │ │ ├── spaceship_rail_game.dart
│ │ │ │ ├── spaceship_ramp_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── arrow_icon
│ │ │ │ ├── arrow_icon_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── ball
│ │ │ │ ├── ball_booster_game.dart
│ │ │ │ ├── basic_ball_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── bottom_group
│ │ │ │ ├── baseboard_game.dart
│ │ │ │ ├── bottom_group.dart
│ │ │ │ ├── flipper_game.dart
│ │ │ │ ├── kicker_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── boundaries
│ │ │ │ ├── boundaries_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── dino_desert
│ │ │ │ ├── chrome_dino_game.dart
│ │ │ │ ├── dino_walls_game.dart
│ │ │ │ ├── slingshots_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── effects
│ │ │ │ ├── camera_zoom_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── error_component
│ │ │ │ ├── error_component_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── flutter_forest
│ │ │ │ ├── dash_bumper_a_game.dart
│ │ │ │ ├── dash_bumper_b_game.dart
│ │ │ │ ├── dash_bumper_main_game.dart
│ │ │ │ ├── signpost_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── google_word
│ │ │ │ ├── google_letter_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── launch_ramp
│ │ │ │ ├── launch_ramp_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── layer
│ │ │ │ ├── layer_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── multiball
│ │ │ │ ├── multiball_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── multipliers
│ │ │ │ ├── multipliers_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── plunger
│ │ │ │ ├── plunger_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── score
│ │ │ │ ├── score_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ ├── sparky_scorch
│ │ │ │ ├── sparky_bumper_game.dart
│ │ │ │ ├── sparky_computer_game.dart
│ │ │ │ └── stories.dart
│ │ │ │ └── stories.dart
│ │ ├── pubspec.lock
│ │ ├── pubspec.yaml
│ │ └── web
│ │ │ ├── favicon.png
│ │ │ ├── icons
│ │ │ ├── Icon-192.png
│ │ │ ├── Icon-512.png
│ │ │ ├── Icon-maskable-192.png
│ │ │ └── Icon-maskable-512.png
│ │ │ ├── index.html
│ │ │ └── manifest.json
│ └── test
│ │ ├── helpers
│ │ ├── helpers.dart
│ │ └── test_game.dart
│ │ └── src
│ │ ├── components
│ │ ├── android_animatronic
│ │ │ └── behaviors
│ │ │ │ └── android_animatronic_ball_contact_behavior_test.dart
│ │ ├── android_animatronic_test.dart
│ │ ├── android_bumper
│ │ │ ├── android_bumper_test.dart
│ │ │ ├── behaviors
│ │ │ │ ├── android_bumper_ball_contact_behavior_test.dart
│ │ │ │ └── android_bumper_blinking_behavior_test.dart
│ │ │ └── cubit
│ │ │ │ └── android_bumper_cubit_test.dart
│ │ ├── android_spaceship
│ │ │ ├── android_spaceship_test.dart
│ │ │ └── cubit
│ │ │ │ └── android_spaceship_cubit_test.dart
│ │ ├── arcade_background
│ │ │ ├── arcade_background_test.dart
│ │ │ └── cubit
│ │ │ │ ├── arcade_background_cubit_test.dart
│ │ │ │ └── arcade_background_state_test.dart
│ │ ├── arrow_icon_test.dart
│ │ ├── ball
│ │ │ ├── ball_test.dart
│ │ │ ├── behaviors
│ │ │ │ ├── ball_gravitating_behavior_test.dart
│ │ │ │ ├── ball_implusing_behavior_test.dart
│ │ │ │ ├── ball_scaling_behavior_test.dart
│ │ │ │ └── ball_turbo_charging_behavior_test.dart
│ │ │ └── cubit
│ │ │ │ ├── ball_cubit_test.dart
│ │ │ │ └── ball_state_test.dart
│ │ ├── baseboard_test.dart
│ │ ├── board_background_sprite_component_test.dart
│ │ ├── board_dimensions_test.dart
│ │ ├── board_side_test.dart
│ │ ├── boundaries_test.dart
│ │ ├── bumping_behavior_test.dart
│ │ ├── camera_zoom_test.dart
│ │ ├── chrome_dino
│ │ │ ├── behaviors
│ │ │ │ ├── chrome_dino_chomping_behavior_test.dart
│ │ │ │ ├── chrome_dino_mouth_opening_behavior_test.dart
│ │ │ │ ├── chrome_dino_spitting_behavior_test.dart
│ │ │ │ └── chrome_dino_swiveling_behavior_test.dart
│ │ │ ├── chrome_dino_test.dart
│ │ │ ├── cubit
│ │ │ │ ├── chrome_dino_cubit_test.dart
│ │ │ │ └── chrome_dino_state_test.dart
│ │ │ └── golden
│ │ │ │ └── chrome_dino
│ │ │ │ ├── down.png
│ │ │ │ ├── middle.png
│ │ │ │ └── up.png
│ │ ├── dash_animatronic_test.dart
│ │ ├── dash_nest_bumper
│ │ │ ├── behaviors
│ │ │ │ └── dash_bumper_ball_contact_behavior_test.dart
│ │ │ ├── cubit
│ │ │ │ ├── dash_bumpers_cubit_test.dart
│ │ │ │ └── dash_bumpers_state_test.dart
│ │ │ └── dash_bumper_test.dart
│ │ ├── dino_walls_test.dart
│ │ ├── error_component_test.dart
│ │ ├── flapper
│ │ │ ├── behaviors
│ │ │ │ └── flapper_spinning_behavior_test.dart
│ │ │ └── flapper_test.dart
│ │ ├── flipper
│ │ │ ├── behaviors
│ │ │ │ ├── flipper_jointing_behavior_test.dart
│ │ │ │ ├── flipper_key_controlling_behavior_test.dart
│ │ │ │ ├── flipper_moving_behavior_test.dart
│ │ │ │ └── flipper_noise_behavior_test.dart
│ │ │ ├── cubit
│ │ │ │ └── flipper_cubit_test.dart
│ │ │ └── flipper_test.dart
│ │ ├── golden
│ │ │ ├── android_animatronic
│ │ │ │ ├── end.png
│ │ │ │ ├── middle.png
│ │ │ │ └── start.png
│ │ │ ├── android_spaceship
│ │ │ │ ├── end.png
│ │ │ │ ├── middle.png
│ │ │ │ └── start.png
│ │ │ ├── arrow_icon_left.png
│ │ │ ├── arrow_icon_right.png
│ │ │ ├── ball
│ │ │ │ ├── android.png
│ │ │ │ ├── dash.png
│ │ │ │ ├── dino.png
│ │ │ │ └── sparky.png
│ │ │ ├── baseboard.png
│ │ │ ├── board_background.png
│ │ │ ├── boundaries.png
│ │ │ ├── camera_zoom
│ │ │ │ ├── finished.png
│ │ │ │ ├── in_between.png
│ │ │ │ └── no_zoom.png
│ │ │ ├── chrome_dino
│ │ │ │ ├── down.png
│ │ │ │ ├── middle.png
│ │ │ │ └── up.png
│ │ │ ├── dash_animatronic
│ │ │ │ ├── end.png
│ │ │ │ ├── middle.png
│ │ │ │ └── start.png
│ │ │ ├── dino_walls.png
│ │ │ ├── flapper
│ │ │ │ ├── end.png
│ │ │ │ ├── middle.png
│ │ │ │ └── start.png
│ │ │ ├── flipper.png
│ │ │ ├── kickers.png
│ │ │ ├── launch_ramp.png
│ │ │ ├── multipliers
│ │ │ │ ├── x2_dimmed.png
│ │ │ │ ├── x2_lit.png
│ │ │ │ ├── x3_dimmed.png
│ │ │ │ ├── x3_lit.png
│ │ │ │ ├── x4_dimmed.png
│ │ │ │ ├── x4_lit.png
│ │ │ │ ├── x5_dimmed.png
│ │ │ │ ├── x5_lit.png
│ │ │ │ ├── x6_dimmed.png
│ │ │ │ └── x6_lit.png
│ │ │ ├── plunger
│ │ │ │ ├── pull.png
│ │ │ │ └── release.png
│ │ │ ├── rocket.png
│ │ │ ├── score
│ │ │ │ ├── 1m.png
│ │ │ │ ├── 200k.png
│ │ │ │ ├── 20k.png
│ │ │ │ └── 5k.png
│ │ │ ├── signpost
│ │ │ │ ├── active1.png
│ │ │ │ ├── active2.png
│ │ │ │ ├── active3.png
│ │ │ │ └── inactive.png
│ │ │ ├── slingshots.png
│ │ │ ├── spaceship_rail.png
│ │ │ ├── spaceship_ramp
│ │ │ │ ├── active1.png
│ │ │ │ ├── active2.png
│ │ │ │ ├── active3.png
│ │ │ │ ├── active4.png
│ │ │ │ ├── active5.png
│ │ │ │ └── inactive.png
│ │ │ ├── sparky_animatronic
│ │ │ │ ├── end.png
│ │ │ │ ├── middle.png
│ │ │ │ └── start.png
│ │ │ └── sparky_computer.png
│ │ ├── google_letter_test.dart
│ │ ├── google_rollover
│ │ │ ├── behaviors
│ │ │ │ └── google_rollover_ball_contact_behavior_test.dart
│ │ │ └── google_rollover_test.dart
│ │ ├── google_word
│ │ │ ├── behaviors
│ │ │ │ └── google_word_animating_behavior_test.dart
│ │ │ ├── cubit
│ │ │ │ ├── google_word_cubit_test.dart
│ │ │ │ └── google_word_state_test.dart
│ │ │ └── google_word_test.dart
│ │ ├── initial_position_test.dart
│ │ ├── joint_anchor_test.dart
│ │ ├── kicker
│ │ │ ├── behaviors
│ │ │ │ ├── kicker_ball_contact_behavior_test.dart
│ │ │ │ └── kicker_blinking_behavior_test.dart
│ │ │ └── cubit
│ │ │ │ └── kicker_cubit_test.dart
│ │ ├── kicker_test.dart
│ │ ├── launch_ramp_test.dart
│ │ ├── layer_sensor
│ │ │ ├── behavior
│ │ │ │ └── layer_filtering_behavior_test.dart
│ │ │ └── layer_sensor_test.dart
│ │ ├── multiball
│ │ │ ├── behaviors
│ │ │ │ └── multiball_blinking_behavior_test.dart
│ │ │ ├── cubit
│ │ │ │ ├── multiball_cubit_test.dart
│ │ │ │ └── multiball_state_test.dart
│ │ │ └── multiball_test.dart
│ │ ├── multiplier
│ │ │ ├── cubit
│ │ │ │ ├── multiplier_cubit_test.dart
│ │ │ │ └── multiplier_state_test.dart
│ │ │ └── multiplier_test.dart
│ │ ├── plunger
│ │ │ ├── behaviors
│ │ │ │ ├── plunger_jointing_behavior_test.dart
│ │ │ │ ├── plunger_key_controlling_behavior_test.dart
│ │ │ │ ├── plunger_noise_behavior_test.dart
│ │ │ │ ├── plunger_pulling_behavior_test.dart
│ │ │ │ └── plunger_releasing_behavior_test.dart
│ │ │ ├── cubit
│ │ │ │ └── plunger_cubit_test.dart
│ │ │ └── plunger_test.dart
│ │ ├── rocket_test.dart
│ │ ├── score_component
│ │ │ ├── behaviors
│ │ │ │ └── score_component_scaling_behavior_test.dart
│ │ │ └── score_component_test.dart
│ │ ├── signpost
│ │ │ ├── cubit
│ │ │ │ └── signpost_cubit_test.dart
│ │ │ └── signpost_test.dart
│ │ ├── skill_shot
│ │ │ ├── behaviors
│ │ │ │ ├── skill_shot_ball_contact_behavior_test.dart
│ │ │ │ └── skill_shot_blinking_behavior_test.dart
│ │ │ ├── cubit
│ │ │ │ ├── skill_shot_cubit_test.dart
│ │ │ │ └── skill_shot_state_test.dart
│ │ │ └── skill_shot_test.dart
│ │ ├── slingshot_test.dart
│ │ ├── spaceship_rail_test.dart
│ │ ├── spaceship_ramp
│ │ │ ├── behavior
│ │ │ │ └── ramp_ball_ascending_contact_behavior_test.dart
│ │ │ ├── cubit
│ │ │ │ ├── spaceship_ramp_cubit_test.dart
│ │ │ │ └── spaceship_ramp_state_test.dart
│ │ │ └── spaceship_ramp_test.dart
│ │ ├── sparky_animatronic_test.dart
│ │ ├── sparky_bumper
│ │ │ ├── behaviors
│ │ │ │ ├── sparky_bumper_ball_contact_behavior_test.dart
│ │ │ │ └── sparky_bumper_blinking_behavior_test.dart
│ │ │ ├── cubit
│ │ │ │ └── sparky_bumper_cubit_test.dart
│ │ │ └── sparky_bumper_test.dart
│ │ └── sparky_computer
│ │ │ ├── behaviors
│ │ │ └── sparky_computer_sensor_ball_contact_behavior_test.dart
│ │ │ ├── cubit
│ │ │ └── sparky_computer_cubit_test.dart
│ │ │ └── sparky_computer_test.dart
│ │ └── extensions
│ │ └── score_test.dart
├── pinball_flame
│ ├── .gitignore
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── pinball_flame.dart
│ │ └── src
│ │ │ ├── behaviors
│ │ │ ├── behaviors.dart
│ │ │ ├── contact_behavior.dart
│ │ │ ├── layer_contact_behavior.dart
│ │ │ └── z_index_contact_behavior.dart
│ │ │ ├── canvas
│ │ │ ├── canvas.dart
│ │ │ ├── canvas_component.dart
│ │ │ ├── canvas_wrapper.dart
│ │ │ └── z_canvas_component.dart
│ │ │ ├── flame_provider.dart
│ │ │ ├── keyboard_input_controller.dart
│ │ │ ├── layer.dart
│ │ │ ├── parent_is_a.dart
│ │ │ ├── pinball_forge2d_game.dart
│ │ │ ├── shapes
│ │ │ ├── arc_shape.dart
│ │ │ ├── bezier_curve_shape.dart
│ │ │ ├── ellipse_shape.dart
│ │ │ └── shapes.dart
│ │ │ └── sprite_animation.dart
│ ├── pubspec.yaml
│ └── test
│ │ ├── layer_test.dart
│ │ └── src
│ │ ├── behaviors
│ │ ├── contact_behavior_test.dart
│ │ ├── layer_contact_behavior_test.dart
│ │ └── z_index_contact_behavior_test.dart
│ │ ├── canvas
│ │ ├── canvas_component_test.dart
│ │ ├── canvas_wrapper_test.dart
│ │ └── z_canvas_component_test.dart
│ │ ├── flame_provider_test.dart
│ │ ├── goldens
│ │ └── rendering
│ │ │ ├── blue_red.png
│ │ │ └── red_blue.png
│ │ ├── keyboard_input_controller_test.dart
│ │ ├── pinball_forge2d_game_test.dart
│ │ ├── rendering
│ │ └── golden
│ │ │ └── rendering
│ │ │ ├── blue_red.png
│ │ │ └── red_blue.png
│ │ ├── shapes
│ │ ├── arc_shape_test.dart
│ │ ├── bezier_curve_shape_test.dart
│ │ └── ellipse_shape_test.dart
│ │ └── sprite_animation_test.dart
├── pinball_theme
│ ├── .gitignore
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── assets
│ │ └── images
│ │ │ ├── android
│ │ │ ├── animation.png
│ │ │ ├── background.jpg
│ │ │ ├── ball.png
│ │ │ ├── icon.png
│ │ │ └── leaderboard_icon.png
│ │ │ ├── dash
│ │ │ ├── animation.png
│ │ │ ├── background.jpg
│ │ │ ├── ball.png
│ │ │ ├── icon.png
│ │ │ └── leaderboard_icon.png
│ │ │ ├── dino
│ │ │ ├── animation.png
│ │ │ ├── background.jpg
│ │ │ ├── ball.png
│ │ │ ├── icon.png
│ │ │ └── leaderboard_icon.png
│ │ │ ├── pinball_button.png
│ │ │ ├── select_character_background.png
│ │ │ └── sparky
│ │ │ ├── animation.png
│ │ │ ├── background.jpg
│ │ │ ├── ball.png
│ │ │ ├── icon.png
│ │ │ └── leaderboard_icon.png
│ ├── lib
│ │ ├── pinball_theme.dart
│ │ └── src
│ │ │ ├── generated
│ │ │ ├── assets.gen.dart
│ │ │ └── generated.dart
│ │ │ └── themes
│ │ │ ├── android_theme.dart
│ │ │ ├── character_theme.dart
│ │ │ ├── dash_theme.dart
│ │ │ ├── dino_theme.dart
│ │ │ ├── sparky_theme.dart
│ │ │ └── themes.dart
│ ├── pubspec.yaml
│ └── test
│ │ └── src
│ │ └── themes
│ │ ├── android_theme_test.dart
│ │ ├── dash_theme_test.dart
│ │ ├── dino_theme_test.dart
│ │ └── sparky_theme_test.dart
├── pinball_ui
│ ├── .gitignore
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── assets
│ │ └── images
│ │ │ ├── button
│ │ │ ├── dpad_down.png
│ │ │ ├── dpad_left.png
│ │ │ ├── dpad_right.png
│ │ │ ├── dpad_up.png
│ │ │ └── pinball_button.png
│ │ │ └── dialog
│ │ │ └── background.png
│ ├── fonts
│ │ ├── PixeloidMono-1G8ae.ttf
│ │ ├── PixeloidSans-nR3g1.ttf
│ │ └── PixeloidSansBold-RpeJo.ttf
│ ├── lib
│ │ ├── gen
│ │ │ ├── assets.gen.dart
│ │ │ ├── fonts.gen.dart
│ │ │ └── gen.dart
│ │ ├── pinball_ui.dart
│ │ └── src
│ │ │ ├── dialog
│ │ │ ├── dialog.dart
│ │ │ ├── pinball_dialog.dart
│ │ │ └── pixelated_decoration.dart
│ │ │ ├── external_links
│ │ │ └── external_links.dart
│ │ │ ├── theme
│ │ │ ├── pinball_colors.dart
│ │ │ ├── pinball_text_style.dart
│ │ │ ├── pinball_theme.dart
│ │ │ └── theme.dart
│ │ │ └── widgets
│ │ │ ├── animated_ellipsis_text.dart
│ │ │ ├── crt_background.dart
│ │ │ ├── pinball_button.dart
│ │ │ ├── pinball_dpad_button.dart
│ │ │ ├── pinball_loading_indicator.dart
│ │ │ └── widgets.dart
│ ├── pubspec.yaml
│ └── test
│ │ └── src
│ │ ├── dialog
│ │ ├── pinball_dialog_test.dart
│ │ └── pixelated_decoration_test.dart
│ │ ├── external_links
│ │ └── external_links_test.dart
│ │ ├── theme
│ │ ├── pinball_colors_test.dart
│ │ ├── pinball_text_style_test.dart
│ │ └── pinball_theme_test.dart
│ │ └── widgets
│ │ ├── animated_ellipsis_text_test.dart
│ │ ├── crt_background_test.dart
│ │ ├── pinball_button_test.dart
│ │ ├── pinball_dpad_button_test.dart
│ │ └── pinball_loading_indicator_test.dart
├── platform_helper
│ ├── .gitignore
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── platform_helper.dart
│ │ └── src
│ │ │ └── platform_helper.dart
│ ├── pubspec.yaml
│ └── test
│ │ └── src
│ │ └── platform_helper_test.dart
└── share_repository
│ ├── .gitignore
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── lib
│ ├── share_repository.dart
│ └── src
│ │ ├── models
│ │ ├── models.dart
│ │ └── share_platform.dart
│ │ └── share_repository.dart
│ ├── pubspec.yaml
│ └── test
│ └── src
│ └── share_repository_test.dart
├── pubspec.lock
├── pubspec.yaml
├── storage.rules
├── test
├── app
│ └── view
│ │ └── app_test.dart
├── assets_manager
│ ├── cubit
│ │ └── assets_manager_state_test.dart
│ └── views
│ │ └── assets_loading_page_test.dart
├── game
│ ├── behaviors
│ │ ├── animatronic_looping_behavior_test.dart
│ │ ├── ball_spawning_behavior_test.dart
│ │ ├── bonus_ball_spawning_behavior_test.dart
│ │ ├── bonus_noise_behavior_test.dart
│ │ ├── bumper_noise_behavior_test.dart
│ │ ├── camera_focusing_behavior_test.dart
│ │ ├── character_selection_behavior_test.dart
│ │ ├── cow_bumper_noise_behavior_test.dart
│ │ ├── kicker_noise_behavior_test.dart
│ │ ├── rollover_noise_behavior_test.dart
│ │ └── scoring_behavior_test.dart
│ ├── bloc
│ │ ├── game_bloc_test.dart
│ │ ├── game_event_test.dart
│ │ └── game_state_test.dart
│ ├── components
│ │ ├── android_acres
│ │ │ ├── android_acres_test.dart
│ │ │ └── behaviors
│ │ │ │ ├── android_spaceship_bonus_behavior_test.dart
│ │ │ │ ├── ramp_bonus_behavior_test.dart
│ │ │ │ ├── ramp_multiplier_behavior_test.dart
│ │ │ │ ├── ramp_progress_behavior_test.dart
│ │ │ │ ├── ramp_reset_behavior_test.dart
│ │ │ │ └── ramp_shot_behavior_test.dart
│ │ ├── backbox
│ │ │ ├── backbox_test.dart
│ │ │ ├── bloc
│ │ │ │ ├── backbox_bloc_test.dart
│ │ │ │ ├── backbox_event_test.dart
│ │ │ │ └── backbox_state_test.dart
│ │ │ └── displays
│ │ │ │ ├── game_over_info_display_test.dart
│ │ │ │ ├── initials_input_display_test.dart
│ │ │ │ ├── initials_submission_failure_display_test.dart
│ │ │ │ ├── initials_submission_success_display_test.dart
│ │ │ │ ├── leaderboard_display_test.dart
│ │ │ │ ├── leaderboard_failure_display_test.dart
│ │ │ │ ├── loading_display_test.dart
│ │ │ │ └── share_display_test.dart
│ │ ├── bottom_group_test.dart
│ │ ├── dino_desert
│ │ │ ├── behaviors
│ │ │ │ └── chrome_dino_bonus_behavior_test.dart
│ │ │ └── dino_desert_test.dart
│ │ ├── drain
│ │ │ ├── behaviors
│ │ │ │ └── draining_behavior_test.dart
│ │ │ └── drain_test.dart
│ │ ├── flutter_forest
│ │ │ ├── behaviors
│ │ │ │ └── flutter_forest_bonus_behavior_test.dart
│ │ │ └── flutter_forest_test.dart
│ │ ├── game_bloc_status_listener_test.dart
│ │ ├── golden
│ │ │ └── backbox.png
│ │ ├── google_gallery
│ │ │ ├── behaviors
│ │ │ │ └── google_word_bonus_behavior_test.dart
│ │ │ └── google_gallery_test.dart
│ │ ├── launcher_test.dart
│ │ ├── multiballs
│ │ │ ├── behaviors
│ │ │ │ └── multiballs_behavior_test.dart
│ │ │ └── multiballs_test.dart
│ │ ├── multipliers
│ │ │ ├── behaviors
│ │ │ │ └── multipliers_behavior_test.dart
│ │ │ └── multipliers_test.dart
│ │ └── sparky_scorch
│ │ │ ├── behaviors
│ │ │ └── sparky_computer_bonus_behavior_test.dart
│ │ │ └── sparky_scorch_test.dart
│ ├── pinball_game_test.dart
│ └── view
│ │ ├── pinball_game_page_test.dart
│ │ └── widgets
│ │ ├── bonus_animation_test.dart
│ │ ├── game_hud_test.dart
│ │ ├── mobile_controls_test.dart
│ │ ├── mobile_dpad_test.dart
│ │ ├── play_button_overlay_test.dart
│ │ ├── replay_button_overlay_test.dart
│ │ ├── round_count_display_test.dart
│ │ └── score_view_test.dart
├── helpers
│ ├── helpers.dart
│ ├── mock_flame_images.dart
│ └── pump_app.dart
├── how_to_play
│ └── how_to_play_dialog_test.dart
├── leaderboard
│ └── models
│ │ └── leader_board_entry_test.dart
├── more_information
│ └── more_information_dialog_test.dart
├── select_character
│ ├── cubit
│ │ ├── character_theme_cubit_test.dart
│ │ └── character_theme_state_test.dart
│ └── view
│ │ └── character_selection_page_test.dart
└── start_game
│ ├── bloc
│ ├── start_game_bloc_test.dart
│ ├── start_game_event_test.dart
│ └── start_game_state_test.dart
│ └── widgets
│ └── start_game_listener_test.dart
└── web
├── __
└── firebase
│ ├── 8.10.1
│ ├── firebase-app.js
│ ├── firebase-auth.js
│ └── firebase-firestore.js
│ └── init.js
├── favicon.png
├── icons
├── Icon-192.png
├── Icon-512.png
└── favicon.png
├── index.html
└── manifest.json
/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "pinball-dev"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | # Every request must be reviewed and accepted by:
2 |
3 | * @erickzanardo @alestiago @RuiMiguel @allisonryan0002
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 |
8 |
9 | ## Description
10 |
11 |
12 |
13 | ## Type of Change
14 |
15 |
16 |
17 | - [ ] ✨ New feature (non-breaking change which adds functionality)
18 | - [ ] 🛠️ Bug fix (non-breaking change which fixes an issue)
19 | - [ ] ❌ Breaking change (fix or feature that would cause existing functionality to change)
20 | - [ ] 🧹 Code refactor
21 | - [ ] ✅ Build configuration change
22 | - [ ] 📝 Documentation
23 | - [ ] 🗑️ Chore
24 |
--------------------------------------------------------------------------------
/.github/workflows/authentication_repository.yaml:
--------------------------------------------------------------------------------
1 | name: authentication_repository
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on:
8 | push:
9 | paths:
10 | - "packages/authentication_repository/**"
11 | - ".github/workflows/authentication_repository.yaml"
12 |
13 | pull_request:
14 | paths:
15 | - "packages/authentication_repository/**"
16 | - ".github/workflows/authentication_repository.yaml"
17 |
18 | jobs:
19 | build:
20 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
21 | with:
22 | working_directory: packages/authentication_repository
23 |
--------------------------------------------------------------------------------
/.github/workflows/geometry.yaml:
--------------------------------------------------------------------------------
1 | name: geometry
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on:
8 | push:
9 | paths:
10 | - "packages/geometry/**"
11 | - ".github/workflows/geometry.yaml"
12 |
13 | pull_request:
14 | paths:
15 | - "packages/geometry/**"
16 | - ".github/workflows/geometry.yaml"
17 |
18 | jobs:
19 | build:
20 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/dart_package.yml@v1
21 | with:
22 | working_directory: packages/geometry
23 |
--------------------------------------------------------------------------------
/.github/workflows/leaderboard_repository.yaml:
--------------------------------------------------------------------------------
1 | name: leaderboard_repository
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on:
8 | push:
9 | paths:
10 | - "packages/leaderboard_repository/**"
11 | - ".github/workflows/leaderboard_repository.yaml"
12 |
13 | pull_request:
14 | paths:
15 | - "packages/leaderboard_repository/**"
16 | - ".github/workflows/leaderboard_repository.yaml"
17 |
18 | jobs:
19 | build:
20 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
21 | with:
22 | working_directory: packages/leaderboard_repository
23 |
--------------------------------------------------------------------------------
/.github/workflows/main.yaml:
--------------------------------------------------------------------------------
1 | name: pinball
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on: [pull_request, push]
8 |
9 | jobs:
10 | build:
11 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
12 | with:
13 | flutter_channel: stable
14 | flutter_version: 2.10.5
15 | coverage_excludes: "lib/gen/*.dart"
16 | test_optimization: false
17 |
18 |
--------------------------------------------------------------------------------
/.github/workflows/pinball_audio.yaml:
--------------------------------------------------------------------------------
1 | name: pinball_audio
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on:
8 | push:
9 | paths:
10 | - "packages/pinball_audio/**"
11 | - ".github/workflows/pinball_audio.yaml"
12 |
13 | pull_request:
14 | paths:
15 | - "packages/pinball_audio/**"
16 | - ".github/workflows/pinball_audio.yaml"
17 |
18 | jobs:
19 | build:
20 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
21 | with:
22 | working_directory: packages/pinball_audio
23 | coverage_excludes: "lib/gen/*.dart"
24 |
--------------------------------------------------------------------------------
/.github/workflows/pinball_components.yaml:
--------------------------------------------------------------------------------
1 | name: pinball_components
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on:
8 | push:
9 | paths:
10 | - "packages/pinball_components/**"
11 | - ".github/workflows/pinball_components.yaml"
12 |
13 | pull_request:
14 | paths:
15 | - "packages/pinball_components/**"
16 | - ".github/workflows/pinball_components.yaml"
17 |
18 | jobs:
19 | build:
20 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
21 | with:
22 | working_directory: packages/pinball_components
23 | coverage_excludes: "lib/gen/*.dart"
24 | test_optimization: false
25 |
--------------------------------------------------------------------------------
/.github/workflows/pinball_flame.yaml:
--------------------------------------------------------------------------------
1 | name: pinball_flame
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on:
8 | push:
9 | paths:
10 | - "packages/pinball_flame/**"
11 | - ".github/workflows/pinball_flame.yaml"
12 |
13 | pull_request:
14 | paths:
15 | - "packages/pinball_flame/**"
16 | - ".github/workflows/pinball_flame.yaml"
17 |
18 | jobs:
19 | build:
20 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
21 | with:
22 | working_directory: packages/pinball_flame
23 | coverage_excludes: "lib/gen/*.dart"
24 | test_optimization: false
25 |
--------------------------------------------------------------------------------
/.github/workflows/pinball_theme.yaml:
--------------------------------------------------------------------------------
1 | name: pinball_theme
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on:
8 | push:
9 | paths:
10 | - "packages/pinball_theme/**"
11 | - ".github/workflows/pinball_theme.yaml"
12 |
13 | pull_request:
14 | paths:
15 | - "packages/pinball_theme/**"
16 | - ".github/workflows/pinball_theme.yaml"
17 |
18 | jobs:
19 | build:
20 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
21 | with:
22 | working_directory: packages/pinball_theme
23 | coverage_excludes: "lib/src/generated/*.dart"
--------------------------------------------------------------------------------
/.github/workflows/pinball_ui.yaml:
--------------------------------------------------------------------------------
1 | name: pinball_ui
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on:
8 | push:
9 | paths:
10 | - "packages/pinball_ui/**"
11 | - ".github/workflows/pinball_ui.yaml"
12 |
13 | pull_request:
14 | paths:
15 | - "packages/pinball_ui/**"
16 | - ".github/workflows/pinball_ui.yaml"
17 |
18 | jobs:
19 | build:
20 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
21 | with:
22 | working_directory: packages/pinball_ui
23 | coverage_excludes: "lib/gen/*.dart"
24 |
--------------------------------------------------------------------------------
/.github/workflows/platform_helper.yaml:
--------------------------------------------------------------------------------
1 | name: platform_helper
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on:
8 | push:
9 | paths:
10 | - "packages/platform_helper/**"
11 | - ".github/workflows/platform_helper.yaml"
12 |
13 | pull_request:
14 | paths:
15 | - "packages/platform_helper/**"
16 | - ".github/workflows/platform_helper.yaml"
17 |
18 | jobs:
19 | build:
20 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
21 | with:
22 | working_directory: packages/platform_helper
23 | coverage_excludes: "lib/gen/*.dart"
24 |
--------------------------------------------------------------------------------
/.github/workflows/share_repository.yaml:
--------------------------------------------------------------------------------
1 | name: share_repository
2 |
3 | on:
4 | push:
5 | paths:
6 | - "packages/share_repository/**"
7 | - ".github/workflows/share_repository.yaml"
8 |
9 | pull_request:
10 | paths:
11 | - "packages/share_repository/**"
12 | - ".github/workflows/share_repository.yaml"
13 |
14 | jobs:
15 | build:
16 | uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
17 | with:
18 | working_directory: packages/share_repository
19 |
--------------------------------------------------------------------------------
/.github/workflows/spell_check.yaml:
--------------------------------------------------------------------------------
1 | name: spell_check
2 |
3 | concurrency:
4 | group: ${{ github.workflow }}-${{ github.ref }}
5 | cancel-in-progress: true
6 |
7 | on: [pull_request]
8 |
9 | jobs:
10 | build:
11 | name: Spell Check
12 | runs-on: ubuntu-latest
13 | steps:
14 | - name: Checkout
15 | uses: actions/checkout@v2
16 |
17 | - name: Check spelling
18 | uses: zwaldowski/cspell-action@v1
19 | with:
20 | paths: '**/*.{dart,arb,md}'
21 | config: .vscode/cspell.json
--------------------------------------------------------------------------------
/.idea/runConfigurations/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 9b2d32b605630f28625709ebd9d78ab3016b2bf6
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // See https://go.microsoft.com/fwlink/?LinkId=827846
3 | // for the documentation about the extensions.json format
4 | "recommendations": [
5 | "dart-code.dart-code",
6 | "dart-code.flutter",
7 | "felixangelov.bloc"
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "name": "Launch pinball",
9 | "request": "launch",
10 | "type": "dart",
11 | "program": "lib/main.dart"
12 | },
13 | {
14 | "name": "Launch component sandbox",
15 | "request": "launch",
16 | "type": "dart",
17 | "program": "packages/pinball_components/sandbox/lib/main.dart"
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:very_good_analysis/analysis_options.2.4.0.yaml
2 | analyzer:
3 | exclude:
4 | - lib/**/*.gen.dart
5 | linter:
6 | rules:
7 | public_member_api_docs: false
--------------------------------------------------------------------------------
/art/readme_header.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tccpro/Social-auth-flutter/a6fd95c9967622bbbece0bee61161ad29f5fdc94/art/readme_header.png
--------------------------------------------------------------------------------
/assets/images/bonus_animation/android_spaceship.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tccpro/Social-auth-flutter/a6fd95c9967622bbbece0bee61161ad29f5fdc94/assets/images/bonus_animation/android_spaceship.png
--------------------------------------------------------------------------------
/assets/images/bonus_animation/dash_nest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tccpro/Social-auth-flutter/a6fd95c9967622bbbece0bee61161ad29f5fdc94/assets/images/bonus_animation/dash_nest.png
--------------------------------------------------------------------------------
/assets/images/bonus_animation/dino_chomp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tccpro/Social-auth-flutter/a6fd95c9967622bbbece0bee61161ad29f5fdc94/assets/images/bonus_animation/dino_chomp.png
--------------------------------------------------------------------------------
/assets/images/bonus_animation/google_word.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tccpro/Social-auth-flutter/a6fd95c9967622bbbece0bee61161ad29f5fdc94/assets/images/bonus_animation/google_word.png
--------------------------------------------------------------------------------
/assets/images/bonus_animation/sparky_turbo_charge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tccpro/Social-auth-flutter/a6fd95c9967622bbbece0bee61161ad29f5fdc94/assets/images/bonus_animation/sparky_turbo_charge.png
--------------------------------------------------------------------------------
/assets/images/components/key.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tccpro/Social-auth-flutter/a6fd95c9967622bbbece0bee61161ad29f5fdc94/assets/images/components/key.png
--------------------------------------------------------------------------------
/assets/images/components/space.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tccpro/Social-auth-flutter/a6fd95c9967622bbbece0bee61161ad29f5fdc94/assets/images/components/space.png
--------------------------------------------------------------------------------
/assets/images/loading_game/io_pinball.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tccpro/Social-auth-flutter/a6fd95c9967622bbbece0bee61161ad29f5fdc94/assets/images/loading_game/io_pinball.png
--------------------------------------------------------------------------------
/assets/images/score/mini_score_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tccpro/Social-auth-flutter/a6fd95c9967622bbbece0bee61161ad29f5fdc94/assets/images/score/mini_score_background.png
--------------------------------------------------------------------------------
/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "firestore": {
3 | "rules": "firestore.rules"
4 | },
5 | "hosting": {
6 | "public": "build/web",
7 | "site": "",
8 | "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
9 | "headers": [
10 | {
11 | "source": "**/*.@(jpg|jpeg|gif|png)",
12 | "headers": [
13 | {
14 | "key": "Cache-Control",
15 | "value": "max-age=3600"
16 | }
17 | ]
18 | },
19 | {
20 | "source": "**",
21 | "headers": [
22 | {
23 | "key": "Cache-Control",
24 | "value": "no-cache, no-store, must-revalidate"
25 | }
26 | ]
27 | }
28 | ]
29 | },
30 | "storage": {
31 | "rules": "storage.rules"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/functions/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/functions/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "functions",
3 | "description": "Cloud Functions for Firebase",
4 | "scripts": {
5 | "serve": "firebase emulators:start --only functions",
6 | "shell": "firebase functions:shell",
7 | "start": "npm run shell",
8 | "deploy": "firebase deploy --only functions",
9 | "logs": "firebase functions:log"
10 | },
11 | "engines": {
12 | "node": "16"
13 | },
14 | "main": "index.js",
15 | "dependencies": {
16 | "firebase-admin": "^10.0.2",
17 | "firebase-functions": "^3.18.0"
18 | },
19 | "devDependencies": {
20 | "firebase-functions-test": "^0.2.0"
21 | },
22 | "private": true
23 | }
24 |
--------------------------------------------------------------------------------
/l10n.yaml:
--------------------------------------------------------------------------------
1 | arb-dir: lib/l10n/arb
2 | template-arb-file: app_en.arb
3 | output-localization-file: app_localizations.dart
4 | nullable-getter: false
5 |
--------------------------------------------------------------------------------
/lib/app/app.dart:
--------------------------------------------------------------------------------
1 | export 'view/app.dart';
2 |
--------------------------------------------------------------------------------
/lib/assets_manager/assets_manager.dart:
--------------------------------------------------------------------------------
1 | export 'cubit/assets_manager_cubit.dart';
2 | export 'views/views.dart';
3 |
--------------------------------------------------------------------------------
/lib/assets_manager/views/views.dart:
--------------------------------------------------------------------------------
1 | export 'assets_loading_page.dart';
2 |
--------------------------------------------------------------------------------
/lib/game/behaviors/animatronic_looping_behavior.dart:
--------------------------------------------------------------------------------
1 | import 'package:flame/components.dart';
2 | import 'package:pinball_flame/pinball_flame.dart';
3 |
4 | class AnimatronicLoopingBehavior extends TimerComponent
5 | with ParentIsA {
6 | AnimatronicLoopingBehavior({
7 | required double animationCoolDown,
8 | }) : super(period: animationCoolDown);
9 |
10 | @override
11 | Future onLoad() async {
12 | await super.onLoad();
13 | parent.animation?.onComplete = () {
14 | parent.animation?.reset();
15 | parent.playing = false;
16 | timer
17 | ..reset()
18 | ..start();
19 | };
20 | }
21 |
22 | @override
23 | void onTick() {
24 | parent.playing = true;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/lib/game/behaviors/behaviors.dart:
--------------------------------------------------------------------------------
1 | export 'animatronic_looping_behavior.dart';
2 | export 'ball_spawning_behavior.dart';
3 | export 'bonus_ball_spawning_behavior.dart';
4 | export 'bonus_noise_behavior.dart';
5 | export 'bumper_noise_behavior.dart';
6 | export 'camera_focusing_behavior.dart';
7 | export 'character_selection_behavior.dart';
8 | export 'cow_bumper_noise_behavior.dart';
9 | export 'kicker_noise_behavior.dart';
10 | export 'rollover_noise_behavior.dart';
11 | export 'scoring_behavior.dart';
12 |
--------------------------------------------------------------------------------
/lib/game/behaviors/bumper_noise_behavior.dart:
--------------------------------------------------------------------------------
1 | import 'package:flame_forge2d/flame_forge2d.dart';
2 | import 'package:pinball_audio/pinball_audio.dart';
3 | import 'package:pinball_flame/pinball_flame.dart';
4 |
5 | class BumperNoiseBehavior extends ContactBehavior {
6 | @override
7 | void beginContact(Object other, Contact contact) {
8 | super.beginContact(other, contact);
9 | readProvider().play(PinballAudio.bumper);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/lib/game/behaviors/cow_bumper_noise_behavior.dart:
--------------------------------------------------------------------------------
1 | // ignore_for_file: public_member_api_docs
2 |
3 | import 'package:flame_forge2d/flame_forge2d.dart';
4 | import 'package:pinball_audio/pinball_audio.dart';
5 | import 'package:pinball_flame/pinball_flame.dart';
6 |
7 | class CowBumperNoiseBehavior extends ContactBehavior {
8 | @override
9 | void beginContact(Object other, Contact contact) {
10 | super.beginContact(other, contact);
11 | readProvider().play(PinballAudio.cowMoo);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/lib/game/behaviors/kicker_noise_behavior.dart:
--------------------------------------------------------------------------------
1 | import 'package:flame_forge2d/flame_forge2d.dart';
2 | import 'package:pinball_audio/pinball_audio.dart';
3 | import 'package:pinball_flame/pinball_flame.dart';
4 |
5 | class KickerNoiseBehavior extends ContactBehavior {
6 | @override
7 | void beginContact(Object other, Contact contact) {
8 | super.beginContact(other, contact);
9 | readProvider().play(PinballAudio.kicker);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/lib/game/behaviors/rollover_noise_behavior.dart:
--------------------------------------------------------------------------------
1 | // ignore_for_file: public_member_api_docs
2 |
3 | import 'package:flame_forge2d/flame_forge2d.dart';
4 | import 'package:pinball_audio/pinball_audio.dart';
5 | import 'package:pinball_flame/pinball_flame.dart';
6 |
7 | class RolloverNoiseBehavior extends ContactBehavior {
8 | @override
9 | void beginContact(Object other, Contact contact) {
10 | super.beginContact(other, contact);
11 | readProvider().play(PinballAudio.rollover);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/lib/game/components/android_acres/behaviors/behaviors.dart:
--------------------------------------------------------------------------------
1 | export 'android_spaceship_bonus_behavior.dart';
2 | export 'ramp_bonus_behavior.dart';
3 | export 'ramp_multiplier_behavior.dart';
4 | export 'ramp_progress_behavior.dart';
5 | export 'ramp_reset_behavior.dart';
6 | export 'ramp_shot_behavior.dart';
7 |
--------------------------------------------------------------------------------
/lib/game/components/android_acres/behaviors/ramp_reset_behavior.dart:
--------------------------------------------------------------------------------
1 | import 'package:flame/components.dart';
2 | import 'package:flame_bloc/flame_bloc.dart';
3 | import 'package:pinball/game/game.dart';
4 | import 'package:pinball_components/pinball_components.dart';
5 | import 'package:pinball_flame/pinball_flame.dart';
6 |
7 | /// Reset [SpaceshipRamp] state when GameState.rounds changes.
8 | class RampResetBehavior extends Component
9 | with FlameBlocListenable {
10 | @override
11 | bool listenWhen(GameState previousState, GameState newState) {
12 | return previousState.rounds != newState.rounds;
13 | }
14 |
15 | @override
16 | void onNewState(GameState state) {
17 | readBloc().onReset();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/lib/game/components/backbox/displays/displays.dart:
--------------------------------------------------------------------------------
1 | export 'game_over_info_display.dart';
2 | export 'initials_input_display.dart';
3 | export 'initials_submission_failure_display.dart';
4 | export 'initials_submission_success_display.dart';
5 | export 'leaderboard_display.dart';
6 | export 'leaderboard_failure_display.dart';
7 | export 'loading_display.dart';
8 | export 'share_display.dart';
9 |
--------------------------------------------------------------------------------
/lib/game/components/backbox/displays/leaderboard_failure_display.dart:
--------------------------------------------------------------------------------
1 | import 'package:flame/components.dart';
2 | import 'package:pinball/l10n/l10n.dart';
3 | import 'package:pinball_components/pinball_components.dart';
4 | import 'package:pinball_flame/pinball_flame.dart';
5 |
6 | /// {@template leaderboard_failure_display}
7 | /// Display showing an error message when the leaderboard couldn't be loaded
8 | /// {@endtemplate}
9 | class LeaderboardFailureDisplay extends Component {
10 | /// {@macro leaderboard_failure_display}
11 | LeaderboardFailureDisplay();
12 |
13 | @override
14 | Future onLoad() async {
15 | final l10n = readProvider();
16 | await add(
17 | ErrorComponent(
18 | label: l10n.leaderboardErrorMessage,
19 | position: Vector2(0, -18),
20 | ),
21 | );
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/game/components/components.dart:
--------------------------------------------------------------------------------
1 | export 'android_acres/android_acres.dart';
2 | export 'backbox/backbox.dart';
3 | export 'bottom_group.dart';
4 | export 'dino_desert/dino_desert.dart';
5 | export 'drain/drain.dart';
6 | export 'flutter_forest/flutter_forest.dart';
7 | export 'game_bloc_status_listener.dart';
8 | export 'google_gallery/google_gallery.dart';
9 | export 'launcher.dart';
10 | export 'multiballs/multiballs.dart';
11 | export 'multipliers/multipliers.dart';
12 | export 'sparky_scorch/sparky_scorch.dart';
13 |
--------------------------------------------------------------------------------
/lib/game/components/dino_desert/behaviors/behaviors.dart:
--------------------------------------------------------------------------------
1 | export 'chrome_dino_bonus_behavior.dart';
2 |
--------------------------------------------------------------------------------
/lib/game/components/drain/behaviors/behaviors.dart:
--------------------------------------------------------------------------------
1 | export 'draining_behavior.dart';
2 |
--------------------------------------------------------------------------------
/lib/game/components/flutter_forest/behaviors/behaviors.dart:
--------------------------------------------------------------------------------
1 | export 'flutter_forest_bonus_behavior.dart';
2 |
--------------------------------------------------------------------------------
/lib/game/components/google_gallery/behaviors/behaviors.dart:
--------------------------------------------------------------------------------
1 | export 'google_word_bonus_behavior.dart';
2 |
--------------------------------------------------------------------------------
/lib/game/components/launcher.dart:
--------------------------------------------------------------------------------
1 | import 'package:flame/components.dart';
2 | import 'package:pinball_components/pinball_components.dart' hide Assets;
3 |
4 | /// {@template launcher}
5 | /// Channel on the right side of the board containing the [LaunchRamp],
6 | /// [Plunger], and [RocketSpriteComponent].
7 | /// {@endtemplate}
8 | class Launcher extends Component {
9 | /// {@macro launcher}
10 | Launcher()
11 | : super(
12 | children: [
13 | LaunchRamp(),
14 | Flapper(),
15 | Plunger()..initialPosition = Vector2(41, 43.7),
16 | RocketSpriteComponent()..position = Vector2(42.8, 62.3),
17 | ],
18 | );
19 | }
20 |
--------------------------------------------------------------------------------
/lib/game/components/multiballs/behaviors/behaviors.dart:
--------------------------------------------------------------------------------
1 | export 'multiballs_behavior.dart';
2 |
--------------------------------------------------------------------------------
/lib/game/components/multipliers/behaviors/behaviors.dart:
--------------------------------------------------------------------------------
1 | export 'multipliers_behavior.dart';
2 |
--------------------------------------------------------------------------------
/lib/game/components/sparky_scorch/behaviors/behaviors.dart:
--------------------------------------------------------------------------------
1 | export 'sparky_computer_bonus_behavior.dart';
2 |
--------------------------------------------------------------------------------
/lib/game/game.dart:
--------------------------------------------------------------------------------
1 | export 'bloc/game_bloc.dart';
2 | export 'components/components.dart';
3 | export 'game_assets.dart';
4 | export 'pinball_game.dart';
5 | export 'view/view.dart';
6 |
--------------------------------------------------------------------------------
/lib/game/view/view.dart:
--------------------------------------------------------------------------------
1 | export 'pinball_game_page.dart';
2 | export 'widgets/widgets.dart';
3 |
--------------------------------------------------------------------------------
/lib/game/view/widgets/play_button_overlay.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_bloc/flutter_bloc.dart';
3 | import 'package:pinball/l10n/l10n.dart';
4 | import 'package:pinball/start_game/start_game.dart';
5 | import 'package:pinball_ui/pinball_ui.dart';
6 |
7 | /// {@template play_button_overlay}
8 | /// [Widget] that renders the button responsible to starting the game
9 | /// {@endtemplate}
10 | class PlayButtonOverlay extends StatelessWidget {
11 | /// {@macro play_button_overlay}
12 | const PlayButtonOverlay({Key? key}) : super(key: key);
13 |
14 | @override
15 | Widget build(BuildContext context) {
16 | final l10n = context.l10n;
17 |
18 | return PinballButton(
19 | text: l10n.play,
20 | onTap: () {
21 | context.read().add(const PlayTapped());
22 | },
23 | );
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/lib/game/view/widgets/widgets.dart:
--------------------------------------------------------------------------------
1 | export 'bonus_animation.dart';
2 | export 'game_hud.dart';
3 | export 'mobile_controls.dart';
4 | export 'mobile_dpad.dart';
5 | export 'play_button_overlay.dart';
6 | export 'replay_button_overlay.dart';
7 | export 'round_count_display.dart';
8 | export 'score_view.dart';
9 |
--------------------------------------------------------------------------------
/lib/gen/gen.dart:
--------------------------------------------------------------------------------
1 | export 'assets.gen.dart';
2 |
--------------------------------------------------------------------------------
/lib/how_to_play/how_to_play.dart:
--------------------------------------------------------------------------------
1 | export 'widgets/widgets.dart';
2 |
--------------------------------------------------------------------------------
/lib/how_to_play/widgets/widgets.dart:
--------------------------------------------------------------------------------
1 | export 'how_to_play_dialog.dart';
2 |
--------------------------------------------------------------------------------
/lib/l10n/l10n.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/widgets.dart';
2 | import 'package:flutter_gen/gen_l10n/app_localizations.dart';
3 |
4 | export 'package:flutter_gen/gen_l10n/app_localizations.dart';
5 |
6 | extension AppLocalizationsX on BuildContext {
7 | AppLocalizations get l10n => AppLocalizations.of(this);
8 | }
9 |
--------------------------------------------------------------------------------
/lib/more_information/more_information.dart:
--------------------------------------------------------------------------------
1 | export 'more_information_dialog.dart';
2 |
--------------------------------------------------------------------------------
/lib/select_character/cubit/character_theme_cubit.dart:
--------------------------------------------------------------------------------
1 | import 'package:bloc/bloc.dart';
2 | import 'package:equatable/equatable.dart';
3 | import 'package:pinball_theme/pinball_theme.dart';
4 |
5 | part 'character_theme_state.dart';
6 |
7 | class CharacterThemeCubit extends Cubit {
8 | CharacterThemeCubit() : super(const CharacterThemeState.initial());
9 |
10 | void characterSelected(CharacterTheme characterTheme) {
11 | emit(CharacterThemeState(characterTheme));
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/lib/select_character/cubit/character_theme_state.dart:
--------------------------------------------------------------------------------
1 | part of 'character_theme_cubit.dart';
2 |
3 | class CharacterThemeState extends Equatable {
4 | const CharacterThemeState(this.characterTheme);
5 |
6 | const CharacterThemeState.initial() : characterTheme = const DashTheme();
7 |
8 | final CharacterTheme characterTheme;
9 |
10 | bool get isSparkySelected => characterTheme == const SparkyTheme();
11 |
12 | bool get isDashSelected => characterTheme == const DashTheme();
13 |
14 | bool get isAndroidSelected => characterTheme == const AndroidTheme();
15 |
16 | bool get isDinoSelected => characterTheme == const DinoTheme();
17 |
18 | @override
19 | List