diff --git a/.github/workflows/share_repository.yaml b/.github/workflows/share_repository.yaml new file mode 100644 index 00000000..2860902b --- /dev/null +++ b/.github/workflows/share_repository.yaml @@ -0,0 +1,18 @@ +name: share_repository + +on: + push: + paths: + - "packages/share_repository/**" + - ".github/workflows/share_repository.yaml" + + pull_request: + paths: + - "packages/share_repository/**" + - ".github/workflows/share_repository.yaml" + +jobs: + build: + uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1 + with: + working_directory: packages/share_repository diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index fc914ebf..7d4b23f7 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -4,7 +4,6 @@ export 'camera_controller.dart'; export 'controlled_ball.dart'; export 'controlled_flipper.dart'; export 'controlled_plunger.dart'; -export 'controlled_sparky_computer.dart'; export 'flutter_forest.dart'; export 'game_flow_controller.dart'; export 'google_word.dart'; diff --git a/lib/game/components/controlled_ball.dart b/lib/game/components/controlled_ball.dart index 6b983cea..4f089a7c 100644 --- a/lib/game/components/controlled_ball.dart +++ b/lib/game/components/controlled_ball.dart @@ -62,10 +62,13 @@ class BallController extends ComponentController Future turboCharge() async { gameRef.read().add(const SparkyTurboChargeActivated()); - // TODO(allisonryan0002): adjust delay to match animation duration once - // given animations. component.stop(); - await Future.delayed(const Duration(seconds: 1)); + // TODO(alestiago): Refactor this hard coded duration once the following is + // merged: + // https://github.com/flame-engine/flame/pull/1564 + await Future.delayed( + const Duration(milliseconds: 2583), + ); component.resume(); await component.boost(Vector2(40, 110)); } diff --git a/lib/game/components/controlled_sparky_computer.dart b/lib/game/components/controlled_sparky_computer.dart deleted file mode 100644 index 65190a1f..00000000 --- a/lib/game/components/controlled_sparky_computer.dart +++ /dev/null @@ -1,52 +0,0 @@ -// ignore_for_file: avoid_renaming_method_parameters - -import 'package:flame/components.dart'; -import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:flutter/material.dart'; -import 'package:pinball/game/game.dart'; -import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_flame/pinball_flame.dart'; - -/// {@template controlled_sparky_computer} -/// [SparkyComputer] with a [SparkyComputerController] attached. -/// {@endtemplate} -class ControlledSparkyComputer extends SparkyComputer - with Controls, HasGameRef { - /// {@macro controlled_sparky_computer} - ControlledSparkyComputer() : super() { - controller = SparkyComputerController(this); - } - - @override - Future onLoad() async { - await super.onLoad(); - gameRef.addContactCallback(SparkyComputerSensorBallContactCallback()); - } -} - -/// {@template sparky_computer_controller} -/// Controller attached to a [SparkyComputer] that handles its game related -/// logic. -/// {@endtemplate} -// TODO(allisonryan0002): listen for turbo charge game bonus and animate Sparky. -class SparkyComputerController - extends ComponentController { - /// {@macro sparky_computer_controller} - SparkyComputerController(ControlledSparkyComputer controlledComputer) - : super(controlledComputer); -} - -/// {@template sparky_computer_sensor_ball_contact_callback} -/// Turbo charges the [Ball] when it enters the [SparkyComputer] -/// {@endtemplate} -@visibleForTesting -class SparkyComputerSensorBallContactCallback - extends ContactCallback { - /// {@macro sparky_computer_sensor_ball_contact_callback} - SparkyComputerSensorBallContactCallback(); - - @override - void begin(_, ControlledBall ball, __) { - ball.controller.turboCharge(); - } -} diff --git a/lib/game/components/sparky_fire_zone.dart b/lib/game/components/sparky_fire_zone.dart index 6d78d32b..a5450761 100644 --- a/lib/game/components/sparky_fire_zone.dart +++ b/lib/game/components/sparky_fire_zone.dart @@ -1,10 +1,10 @@ // ignore_for_file: avoid_renaming_method_parameters -import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; /// {@template sparky_fire_zone} /// Area positioned at the top left of the [Board] where the [Ball] @@ -12,29 +12,21 @@ import 'package:pinball_components/pinball_components.dart'; /// /// When a [Ball] hits [SparkyBumper]s, the bumper animates. /// {@endtemplate} -class SparkyFireZone extends Component with HasGameRef { +class SparkyFireZone extends Blueprint { /// {@macro sparky_fire_zone} - SparkyFireZone(); - - @override - Future onLoad() async { - await super.onLoad(); - - gameRef.addContactCallback(SparkyBumperBallContactCallback()); - - final lowerLeftBumper = _SparkyBumper.a() - ..initialPosition = Vector2(-22.9, -41.65); - final upperLeftBumper = _SparkyBumper.b() - ..initialPosition = Vector2(-21.25, -57.9); - final rightBumper = _SparkyBumper.c() - ..initialPosition = Vector2(-3.3, -52.55); - - await addAll([ - lowerLeftBumper, - upperLeftBumper, - rightBumper, - ]); - } + SparkyFireZone() + : super( + components: [ + _SparkyBumper.a()..initialPosition = Vector2(-22.9, -41.65), + _SparkyBumper.b()..initialPosition = Vector2(-21.25, -57.9), + _SparkyBumper.c()..initialPosition = Vector2(-3.3, -52.55), + SparkyComputerSensor()..initialPosition = Vector2(-13, -49.8), + SparkyAnimatronic()..position = Vector2(-13.8, -58.2), + ], + blueprints: [ + SparkyComputer(), + ], + ); } // TODO(alestiago): Revisit ScorePoints logic once the FlameForge2D @@ -48,6 +40,14 @@ class _SparkyBumper extends SparkyBumper with ScorePoints { @override int get points => 20; + + @override + Future onLoad() async { + await super.onLoad(); + // TODO(alestiago): Revisit once this has been merged: + // https://github.com/flame-engine/flame/pull/1547 + gameRef.addContactCallback(SparkyBumperBallContactCallback()); + } } /// Listens when a [Ball] bounces bounces against a [SparkyBumper]. @@ -63,3 +63,48 @@ class SparkyBumperBallContactCallback sparkyBumper.animate(); } } + +/// {@template sparky_computer_sensor} +/// Small sensor body used to detect when a ball has entered the +/// [SparkyComputer]. +/// {@endtemplate} +// TODO(alestiago): Revisit once this has been merged: +// https://github.com/flame-engine/flame/pull/1547 +class SparkyComputerSensor extends BodyComponent with InitialPosition { + /// {@macro sparky_computer_sensor} + SparkyComputerSensor() { + renderBody = false; + } + + @override + Body createBody() { + final shape = CircleShape()..radius = 0.1; + final fixtureDef = FixtureDef(shape, isSensor: true); + final bodyDef = BodyDef( + position: initialPosition, + userData: this, + ); + return world.createBody(bodyDef)..createFixture(fixtureDef); + } + + @override + Future onLoad() async { + await super.onLoad(); + // TODO(alestiago): Revisit once this has been merged: + // https://github.com/flame-engine/flame/pull/1547 + gameRef.addContactCallback(SparkyComputerSensorBallContactCallback()); + } +} + +@visibleForTesting +// TODO(alestiago): Revisit once this has been merged: +// https://github.com/flame-engine/flame/pull/1547 +// ignore: public_member_api_docs +class SparkyComputerSensorBallContactCallback + extends ContactCallback { + @override + void begin(_, ControlledBall controlledBall, __) { + controlledBall.controller.turboCharge(); + controlledBall.gameRef.firstChild()?.playing = true; + } +} diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index 1cd4f194..9dc88562 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -43,8 +43,11 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.dash.bumper.b.inactive.keyName), images.load(components.Assets.images.dash.bumper.main.active.keyName), images.load(components.Assets.images.dash.bumper.main.inactive.keyName), + images.load(components.Assets.images.plunger.plunger.keyName), + images.load(components.Assets.images.plunger.rocket.keyName), images.load(components.Assets.images.boundary.bottom.keyName), images.load(components.Assets.images.boundary.outer.keyName), + images.load(components.Assets.images.boundary.outerBottom.keyName), images.load(components.Assets.images.spaceship.saucer.keyName), images.load(components.Assets.images.spaceship.bridge.keyName), images.load(components.Assets.images.spaceship.ramp.boardOpening.keyName), @@ -80,12 +83,11 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.alienBumper.b.inactive.keyName), images.load(components.Assets.images.chromeDino.mouth.keyName), images.load(components.Assets.images.chromeDino.head.keyName), - images.load(components.Assets.images.plunger.plunger.keyName), - images.load(components.Assets.images.plunger.rocket.keyName), - images.load(components.Assets.images.sparky.computer.base.keyName), images.load(components.Assets.images.sparky.computer.top.keyName), - images.load(components.Assets.images.sparky.bumper.a.active.keyName), + images.load(components.Assets.images.sparky.computer.base.keyName), + images.load(components.Assets.images.sparky.animatronic.keyName), images.load(components.Assets.images.sparky.bumper.a.inactive.keyName), + images.load(components.Assets.images.sparky.bumper.a.active.keyName), images.load(components.Assets.images.sparky.bumper.b.active.keyName), images.load(components.Assets.images.sparky.bumper.b.inactive.keyName), images.load(components.Assets.images.sparky.bumper.c.active.keyName), diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index d73fb33c..55a6b23a 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flame/components.dart'; +import 'package:flame/game.dart'; import 'package:flame/input.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; @@ -49,13 +50,13 @@ class PinballGame extends Forge2DGame // TODO(allisonryan0002): banish Wall and Board classes in later PR. await add(BottomWall()); unawaited(addFromBlueprint(Boundaries())); - unawaited(addFromBlueprint(ControlledSparkyComputer())); + unawaited(addFromBlueprint(LaunchRamp())); final launcher = Launcher(); unawaited(addFromBlueprint(launcher)); unawaited(add(Board())); unawaited(add(AlienZone())); - unawaited(add(SparkyFireZone())); + await addFromBlueprint(SparkyFireZone()); unawaited(addFromBlueprint(Slingshots())); unawaited(addFromBlueprint(DinoWalls())); unawaited(_addBonusWord()); @@ -134,7 +135,7 @@ class _GameBallsController extends ComponentController } } -class DebugPinballGame extends PinballGame with TapDetector { +class DebugPinballGame extends PinballGame with FPSCounter, TapDetector { DebugPinballGame({ required PinballTheme theme, required PinballAudio audio, @@ -149,6 +150,7 @@ class DebugPinballGame extends PinballGame with TapDetector { Future onLoad() async { await super.onLoad(); await _loadBackground(); + await add(_DebugInformation()); } // TODO(alestiago): Move to PinballGame once we have the real background @@ -191,3 +193,35 @@ class _DebugGameBallsController extends _GameBallsController { return noBallsLeft && canBallRespawn; } } + +class _DebugInformation extends Component with HasGameRef { + _DebugInformation() : super(priority: RenderPriority.debugInfo); + + @override + PositionType get positionType => PositionType.widget; + + final _debugTextPaint = TextPaint( + style: const TextStyle( + color: Colors.green, + fontSize: 10, + ), + ); + + final _debugBackgroundPaint = Paint()..color = Colors.white; + + @override + void render(Canvas canvas) { + final debugText = [ + 'FPS: ${gameRef.fps().toStringAsFixed(1)}', + 'BALLS: ${gameRef.descendants().whereType().length}', + ].join(' | '); + + final height = _debugTextPaint.measureTextHeight(debugText); + final position = Vector2(0, gameRef.camera.canvasSize.y - height); + canvas.drawRect( + position & Vector2(gameRef.camera.canvasSize.x, height), + _debugBackgroundPaint, + ); + _debugTextPaint.render(canvas, debugText, position); + } +} diff --git a/lib/leaderboard/models/leader_board_entry.dart b/lib/leaderboard/models/leader_board_entry.dart index cfd5ffd4..a86975dd 100644 --- a/lib/leaderboard/models/leader_board_entry.dart +++ b/lib/leaderboard/models/leader_board_entry.dart @@ -36,7 +36,7 @@ extension LeaderboardEntryDataX on LeaderboardEntryData { rank: position.toString(), playerInitials: playerInitials, score: score, - character: character.toTheme.character, + character: character.toTheme.leaderboardIcon, ); } } diff --git a/lib/theme/view/character_selection_page.dart b/lib/theme/view/character_selection_page.dart index 22aaee22..ef37270b 100644 --- a/lib/theme/view/character_selection_page.dart +++ b/lib/theme/view/character_selection_page.dart @@ -124,7 +124,7 @@ class CharacterImageButton extends StatelessWidget { ), child: Padding( padding: const EdgeInsets.all(8), - child: characterTheme.character.image(), + child: characterTheme.icon.image(), ), ), ); diff --git a/packages/pinball_components/assets/images/boundary/outer-bottom.png b/packages/pinball_components/assets/images/boundary/outer-bottom.png new file mode 100644 index 00000000..508bcee8 Binary files /dev/null and b/packages/pinball_components/assets/images/boundary/outer-bottom.png differ diff --git a/packages/pinball_components/assets/images/sparky/animatronic.png b/packages/pinball_components/assets/images/sparky/animatronic.png new file mode 100644 index 00000000..cc57e405 Binary files /dev/null and b/packages/pinball_components/assets/images/sparky/animatronic.png differ diff --git a/packages/pinball_components/assets/images/sparky/computer/base.png b/packages/pinball_components/assets/images/sparky/computer/base.png index 2e8fe362..188e4329 100644 Binary files a/packages/pinball_components/assets/images/sparky/computer/base.png and b/packages/pinball_components/assets/images/sparky/computer/base.png differ diff --git a/packages/pinball_components/assets/images/sparky/computer/top.png b/packages/pinball_components/assets/images/sparky/computer/top.png index d9f3bc6c..085771cd 100644 Binary files a/packages/pinball_components/assets/images/sparky/computer/top.png and b/packages/pinball_components/assets/images/sparky/computer/top.png differ diff --git a/packages/pinball_components/lib/gen/assets.gen.dart b/packages/pinball_components/lib/gen/assets.gen.dart index 0d67f870..4d4cda7d 100644 --- a/packages/pinball_components/lib/gen/assets.gen.dart +++ b/packages/pinball_components/lib/gen/assets.gen.dart @@ -86,6 +86,10 @@ class $AssetsImagesBoundaryGen { AssetGenImage get bottom => const AssetGenImage('assets/images/boundary/bottom.png'); + /// File path: assets/images/boundary/outer-bottom.png + AssetGenImage get outerBottom => + const AssetGenImage('assets/images/boundary/outer-bottom.png'); + /// File path: assets/images/boundary/outer.png AssetGenImage get outer => const AssetGenImage('assets/images/boundary/outer.png'); @@ -257,6 +261,8 @@ class $AssetsImagesSpaceshipGen { class $AssetsImagesSparkyGen { const $AssetsImagesSparkyGen(); + AssetGenImage get animatronic => + const AssetGenImage('assets/images/sparky/animatronic.png'); $AssetsImagesSparkyBumperGen get bumper => const $AssetsImagesSparkyBumperGen(); $AssetsImagesSparkyComputerGen get computer => diff --git a/packages/pinball_components/lib/src/components/boundaries.dart b/packages/pinball_components/lib/src/components/boundaries.dart index 254cbfcf..86e1844e 100644 --- a/packages/pinball_components/lib/src/components/boundaries.dart +++ b/packages/pinball_components/lib/src/components/boundaries.dart @@ -13,6 +13,7 @@ class Boundaries extends Blueprint { components: [ _BottomBoundary(), _OuterBoundary(), + _OuterBottomBoundarySpriteComponent(), ], ); } @@ -91,8 +92,10 @@ class _OuterBoundary extends BodyComponent with InitialPosition { /// {@macro outer_boundary} _OuterBoundary() : super( - priority: RenderPriority.outerBoudary, - children: [_OuterBoundarySpriteComponent()], + priority: RenderPriority.outerBoundary, + children: [ + _OuterBoundarySpriteComponent(), + ], ) { renderBody = false; } @@ -157,3 +160,25 @@ class _OuterBoundarySpriteComponent extends SpriteComponent with HasGameRef { size = sprite.originalSize / 10; } } + +class _OuterBottomBoundarySpriteComponent extends SpriteComponent + with HasGameRef { + _OuterBottomBoundarySpriteComponent() + : super( + priority: RenderPriority.outerBottomBoundary, + anchor: Anchor.center, + position: Vector2(0, 71), + ); + + @override + Future onLoad() async { + await super.onLoad(); + final sprite = Sprite( + gameRef.images.fromCache( + Assets.images.boundary.outerBottom.keyName, + ), + ); + this.sprite = sprite; + size = sprite.originalSize / 10; + } +} diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index 9ea39d69..57e93abb 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -29,5 +29,6 @@ export 'slingshot.dart'; export 'spaceship.dart'; export 'spaceship_rail.dart'; export 'spaceship_ramp.dart'; +export 'sparky_animatronic.dart'; export 'sparky_bumper.dart'; export 'sparky_computer.dart'; diff --git a/packages/pinball_components/lib/src/components/dash_animatronic.dart b/packages/pinball_components/lib/src/components/dash_animatronic.dart index f1c5b145..47e1e08f 100644 --- a/packages/pinball_components/lib/src/components/dash_animatronic.dart +++ b/packages/pinball_components/lib/src/components/dash_animatronic.dart @@ -38,17 +38,9 @@ class DashAnimatronic extends SpriteAnimationComponent with HasGameRef { textureSize: textureSize, loop: false, ), - ); - } - - @override - void update(double dt) { - super.update(dt); - if (animation != null) { - if (animation!.isLastFrame) { - animation!.reset(); + )..onComplete = () { + animation?.reset(); playing = false; - } - } + }; } } diff --git a/packages/pinball_components/lib/src/components/render_priority.dart b/packages/pinball_components/lib/src/components/render_priority.dart index b179cce9..d2438db9 100644 --- a/packages/pinball_components/lib/src/components/render_priority.dart +++ b/packages/pinball_components/lib/src/components/render_priority.dart @@ -39,7 +39,9 @@ abstract class RenderPriority { static const int bottomBoundary = _above + dinoBottomWall; - static const int outerBoudary = _above + background; + static const int outerBoundary = _above + background; + + static const int outerBottomBoundary = _above + rocket; // Bottom Group @@ -47,7 +49,7 @@ abstract class RenderPriority { // Launcher - static const int launchRamp = _above + outerBoudary; + static const int launchRamp = _above + outerBoundary; static const int launchRampForegroundRailing = _below + ballOnBoard; @@ -113,4 +115,7 @@ abstract class RenderPriority { // Score Text static const int scoreText = _above + spaceshipRampForegroundRailing; + + // Debug information + static const int debugInfo = _above + scoreText; } diff --git a/packages/pinball_components/lib/src/components/sparky_animatronic.dart b/packages/pinball_components/lib/src/components/sparky_animatronic.dart new file mode 100644 index 00000000..714a5700 --- /dev/null +++ b/packages/pinball_components/lib/src/components/sparky_animatronic.dart @@ -0,0 +1,46 @@ +import 'package:flame/components.dart'; +import 'package:pinball_components/pinball_components.dart'; + +/// {@template sparky_animatronic} +/// Animated Sparky that sits on top of the [SparkyComputer]. +/// {@endtemplate} +class SparkyAnimatronic extends SpriteAnimationComponent with HasGameRef { + /// {@macro sparky_animatronic} + SparkyAnimatronic() + : super( + anchor: Anchor.center, + playing: false, + priority: RenderPriority.sparkyAnimatronic, + ); + + @override + Future onLoad() async { + await super.onLoad(); + + final spriteSheet = gameRef.images.fromCache( + Assets.images.sparky.animatronic.keyName, + ); + + const amountPerRow = 9; + const amountPerColumn = 7; + final textureSize = Vector2( + spriteSheet.width / amountPerRow, + spriteSheet.height / amountPerColumn, + ); + size = textureSize / 10; + + animation = SpriteAnimation.fromFrameData( + spriteSheet, + SpriteAnimationData.sequenced( + amount: (amountPerRow * amountPerColumn) - 1, + amountPerRow: amountPerRow, + stepTime: 1 / 24, + textureSize: textureSize, + loop: false, + ), + )..onComplete = () { + animation?.reset(); + playing = false; + }; + } +} diff --git a/packages/pinball_components/lib/src/components/sparky_computer.dart b/packages/pinball_components/lib/src/components/sparky_computer.dart index 4cec4c59..481de63d 100644 --- a/packages/pinball_components/lib/src/components/sparky_computer.dart +++ b/packages/pinball_components/lib/src/components/sparky_computer.dart @@ -7,9 +7,6 @@ import 'package:pinball_flame/pinball_flame.dart'; /// {@template sparky_computer} /// A computer owned by Sparky. -/// -/// Register a [ContactCallback] for [SparkyComputerSensor] to listen when -/// something enters the [SparkyComputer]. /// {@endtemplate} class SparkyComputer extends Blueprint { /// {@macro sparky_computer} @@ -18,7 +15,6 @@ class SparkyComputer extends Blueprint { components: [ _ComputerBase(), _ComputerTopSpriteComponent(), - SparkyComputerSensor(), ], ); } @@ -104,24 +100,3 @@ class _ComputerTopSpriteComponent extends SpriteComponent with HasGameRef { size = sprite.originalSize / 10; } } - -/// {@template sparky_computer_sensor} -/// Small sensor body used to detect when a ball has entered the -/// [SparkyComputer]. -/// {@endtemplate} -class SparkyComputerSensor extends BodyComponent with InitialPosition { - /// {@macro sparky_computer_sensor} - SparkyComputerSensor() { - renderBody = false; - } - - @override - Body createBody() { - final shape = CircleShape()..radius = 0.1; - final fixtureDef = FixtureDef(shape, isSensor: true); - final bodyDef = BodyDef() - ..position = initialPosition - ..userData = this; - return world.createBody(bodyDef)..createFixture(fixtureDef); - } -} diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index 7df3429a..a7cb8367 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -61,6 +61,7 @@ flutter: - assets/images/slingshot/ - assets/images/alien_bumper/a/ - assets/images/alien_bumper/b/ + - assets/images/sparky/ - assets/images/sparky/computer/ - assets/images/sparky/bumper/a/ - assets/images/sparky/bumper/b/ diff --git a/packages/pinball_components/sandbox/lib/stories/boundaries/boundaries_game.dart b/packages/pinball_components/sandbox/lib/stories/boundaries/boundaries_game.dart index 7ec113e4..cf78750d 100644 --- a/packages/pinball_components/sandbox/lib/stories/boundaries/boundaries_game.dart +++ b/packages/pinball_components/sandbox/lib/stories/boundaries/boundaries_game.dart @@ -8,6 +8,7 @@ class BoundariesGame extends BallGame { : super( imagesFileNames: [ Assets.images.boundary.outer.keyName, + Assets.images.boundary.outerBottom.keyName, Assets.images.boundary.bottom.keyName, ], ); diff --git a/packages/pinball_components/test/src/components/boundaries_test.dart b/packages/pinball_components/test/src/components/boundaries_test.dart index 9affe0b7..4e2fb497 100644 --- a/packages/pinball_components/test/src/components/boundaries_test.dart +++ b/packages/pinball_components/test/src/components/boundaries_test.dart @@ -10,20 +10,24 @@ import '../../helpers/helpers.dart'; void main() { group('Boundaries', () { + TestWidgetsFlutterBinding.ensureInitialized(); + final assets = [ Assets.images.boundary.outer.keyName, + Assets.images.boundary.outerBottom.keyName, Assets.images.boundary.bottom.keyName, ]; - final tester = FlameTester(TestGame.new); + final flameTester = FlameTester(TestGame.new); - tester.testGameWidget( + flameTester.testGameWidget( 'render correctly', setUp: (game, tester) async { await game.images.loadAll(assets); await game.addFromBlueprint(Boundaries()); + await game.ready(); + game.camera.followVector2(Vector2.zero()); game.camera.zoom = 3.2; - await tester.pump(); }, verify: (game, tester) async { await expectLater( diff --git a/packages/pinball_components/test/src/components/dash_animatronic_test.dart b/packages/pinball_components/test/src/components/dash_animatronic_test.dart index 8b5d0e30..d0707223 100644 --- a/packages/pinball_components/test/src/components/dash_animatronic_test.dart +++ b/packages/pinball_components/test/src/components/dash_animatronic_test.dart @@ -22,7 +22,9 @@ void main() { await tester.pump(); }, verify: (game, tester) async { - const animationDuration = 3.25; + final animationDuration = + game.firstChild()!.animation!.totalDuration(); + await expectLater( find.byGame(), matchesGoldenFile('golden/dash_animatronic/start.png'), @@ -60,8 +62,7 @@ void main() { await game.ensureAdd(dashAnimatronic); dashAnimatronic.playing = true; - dashAnimatronic.animation?.setToLast(); - game.update(1); + game.update(4); expect(dashAnimatronic.playing, isFalse); }, diff --git a/packages/pinball_components/test/src/components/golden/boundaries.png b/packages/pinball_components/test/src/components/golden/boundaries.png index ecb396c4..6cb24bbd 100644 Binary files a/packages/pinball_components/test/src/components/golden/boundaries.png and b/packages/pinball_components/test/src/components/golden/boundaries.png differ diff --git a/packages/pinball_components/test/src/components/golden/dash_animatronic/end.png b/packages/pinball_components/test/src/components/golden/dash_animatronic/end.png index 3e5e91f5..c8218fe1 100644 Binary files a/packages/pinball_components/test/src/components/golden/dash_animatronic/end.png and b/packages/pinball_components/test/src/components/golden/dash_animatronic/end.png differ diff --git a/packages/pinball_components/test/src/components/golden/sparky-computer.png b/packages/pinball_components/test/src/components/golden/sparky-computer.png index 109f9903..165a79da 100644 Binary files a/packages/pinball_components/test/src/components/golden/sparky-computer.png and b/packages/pinball_components/test/src/components/golden/sparky-computer.png differ diff --git a/packages/pinball_components/test/src/components/golden/sparky_animatronic/end.png b/packages/pinball_components/test/src/components/golden/sparky_animatronic/end.png new file mode 100644 index 00000000..5e963f14 Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/sparky_animatronic/end.png differ diff --git a/packages/pinball_components/test/src/components/golden/sparky_animatronic/middle.png b/packages/pinball_components/test/src/components/golden/sparky_animatronic/middle.png new file mode 100644 index 00000000..2665c5cb Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/sparky_animatronic/middle.png differ diff --git a/packages/pinball_components/test/src/components/golden/sparky_animatronic/start.png b/packages/pinball_components/test/src/components/golden/sparky_animatronic/start.png new file mode 100644 index 00000000..ea3e6344 Binary files /dev/null and b/packages/pinball_components/test/src/components/golden/sparky_animatronic/start.png differ diff --git a/packages/pinball_components/test/src/components/sparky_animatronic_test.dart b/packages/pinball_components/test/src/components/sparky_animatronic_test.dart new file mode 100644 index 00000000..66c2e0a6 --- /dev/null +++ b/packages/pinball_components/test/src/components/sparky_animatronic_test.dart @@ -0,0 +1,76 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame/extensions.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; + +import '../../helpers/helpers.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('SparkyAnimatronic', () { + final asset = Assets.images.sparky.animatronic.keyName; + final flameTester = FlameTester(() => TestGame([asset])); + + flameTester.testGameWidget( + 'renders correctly', + setUp: (game, tester) async { + await game.images.load(asset); + await game.ensureAdd(SparkyAnimatronic()..playing = true); + await tester.pump(); + + game.camera.followVector2(Vector2.zero()); + }, + verify: (game, tester) async { + final animationDuration = + game.firstChild()!.animation!.totalDuration(); + + await expectLater( + find.byGame(), + matchesGoldenFile('golden/sparky_animatronic/start.png'), + ); + + game.update(animationDuration * 0.25); + await tester.pump(); + await expectLater( + find.byGame(), + matchesGoldenFile('golden/sparky_animatronic/middle.png'), + ); + + game.update(animationDuration * 0.75); + await tester.pump(); + await expectLater( + find.byGame(), + matchesGoldenFile('golden/sparky_animatronic/end.png'), + ); + }, + ); + + flameTester.test( + 'loads correctly', + (game) async { + final sparkyAnimatronic = SparkyAnimatronic(); + await game.ensureAdd(sparkyAnimatronic); + + expect(game.contains(sparkyAnimatronic), isTrue); + }, + ); + + flameTester.test( + 'stops animating after animation completes', + (game) async { + final sparkyAnimatronic = SparkyAnimatronic(); + await game.ensureAdd(sparkyAnimatronic); + + sparkyAnimatronic.playing = true; + final animationDuration = + game.firstChild()!.animation!.totalDuration(); + game.update(animationDuration); + + expect(sparkyAnimatronic.playing, isFalse); + }, + ); + }); +} diff --git a/packages/pinball_theme/assets/images/android/animation.png b/packages/pinball_theme/assets/images/android/animation.png new file mode 100644 index 00000000..fc7465be Binary files /dev/null and b/packages/pinball_theme/assets/images/android/animation.png differ diff --git a/packages/pinball_theme/assets/images/android/character.png b/packages/pinball_theme/assets/images/android/character.png deleted file mode 100644 index 736f1e6f..00000000 Binary files a/packages/pinball_theme/assets/images/android/character.png and /dev/null differ diff --git a/packages/pinball_theme/assets/images/dash/animation.png b/packages/pinball_theme/assets/images/dash/animation.png new file mode 100644 index 00000000..e812415f Binary files /dev/null and b/packages/pinball_theme/assets/images/dash/animation.png differ diff --git a/packages/pinball_theme/assets/images/dash/character.png b/packages/pinball_theme/assets/images/dash/character.png deleted file mode 100644 index d76795aa..00000000 Binary files a/packages/pinball_theme/assets/images/dash/character.png and /dev/null differ diff --git a/packages/pinball_theme/assets/images/dino/animation.png b/packages/pinball_theme/assets/images/dino/animation.png new file mode 100644 index 00000000..c75b16f9 Binary files /dev/null and b/packages/pinball_theme/assets/images/dino/animation.png differ diff --git a/packages/pinball_theme/assets/images/dino/character.png b/packages/pinball_theme/assets/images/dino/character.png deleted file mode 100644 index c6f5a390..00000000 Binary files a/packages/pinball_theme/assets/images/dino/character.png and /dev/null differ diff --git a/packages/pinball_theme/assets/images/sparky/animation.png b/packages/pinball_theme/assets/images/sparky/animation.png new file mode 100644 index 00000000..1aff4772 Binary files /dev/null and b/packages/pinball_theme/assets/images/sparky/animation.png differ diff --git a/packages/pinball_theme/assets/images/sparky/character.png b/packages/pinball_theme/assets/images/sparky/character.png deleted file mode 100644 index c37403b3..00000000 Binary files a/packages/pinball_theme/assets/images/sparky/character.png and /dev/null differ diff --git a/packages/pinball_theme/lib/src/generated/assets.gen.dart b/packages/pinball_theme/lib/src/generated/assets.gen.dart index f050c621..3feeecce 100644 --- a/packages/pinball_theme/lib/src/generated/assets.gen.dart +++ b/packages/pinball_theme/lib/src/generated/assets.gen.dart @@ -28,6 +28,10 @@ class $AssetsImagesGen { class $AssetsImagesAndroidGen { const $AssetsImagesAndroidGen(); + /// File path: assets/images/android/animation.png + AssetGenImage get animation => + const AssetGenImage('assets/images/android/animation.png'); + /// File path: assets/images/android/background.png AssetGenImage get background => const AssetGenImage('assets/images/android/background.png'); @@ -48,6 +52,10 @@ class $AssetsImagesAndroidGen { class $AssetsImagesDashGen { const $AssetsImagesDashGen(); + /// File path: assets/images/dash/animation.png + AssetGenImage get animation => + const AssetGenImage('assets/images/dash/animation.png'); + /// File path: assets/images/dash/background.png AssetGenImage get background => const AssetGenImage('assets/images/dash/background.png'); @@ -67,6 +75,10 @@ class $AssetsImagesDashGen { class $AssetsImagesDinoGen { const $AssetsImagesDinoGen(); + /// File path: assets/images/dino/animation.png + AssetGenImage get animation => + const AssetGenImage('assets/images/dino/animation.png'); + /// File path: assets/images/dino/background.png AssetGenImage get background => const AssetGenImage('assets/images/dino/background.png'); @@ -86,6 +98,10 @@ class $AssetsImagesDinoGen { class $AssetsImagesSparkyGen { const $AssetsImagesSparkyGen(); + /// File path: assets/images/sparky/animation.png + AssetGenImage get animation => + const AssetGenImage('assets/images/sparky/animation.png'); + /// File path: assets/images/sparky/background.png AssetGenImage get background => const AssetGenImage('assets/images/sparky/background.png'); diff --git a/packages/pinball_theme/lib/src/themes/android_theme.dart b/packages/pinball_theme/lib/src/themes/android_theme.dart index 1001ca5f..8989c717 100644 --- a/packages/pinball_theme/lib/src/themes/android_theme.dart +++ b/packages/pinball_theme/lib/src/themes/android_theme.dart @@ -14,9 +14,6 @@ class AndroidTheme extends CharacterTheme { @override Color get ballColor => Colors.green; - @override - AssetGenImage get character => Assets.images.android.character; - @override AssetGenImage get background => Assets.images.android.background; @@ -25,4 +22,7 @@ class AndroidTheme extends CharacterTheme { @override AssetGenImage get leaderboardIcon => Assets.images.android.leaderboardIcon; + + @override + AssetGenImage get animation => Assets.images.android.animation; } diff --git a/packages/pinball_theme/lib/src/themes/character_theme.dart b/packages/pinball_theme/lib/src/themes/character_theme.dart index 9c5f6ba6..072c917f 100644 --- a/packages/pinball_theme/lib/src/themes/character_theme.dart +++ b/packages/pinball_theme/lib/src/themes/character_theme.dart @@ -18,9 +18,6 @@ abstract class CharacterTheme extends Equatable { /// Ball color for this theme. Color get ballColor; - /// Asset for the theme character. - AssetGenImage get character; - /// Asset for the background. AssetGenImage get background; @@ -30,13 +27,16 @@ abstract class CharacterTheme extends Equatable { /// Icon asset for the leaderboard. AssetGenImage get leaderboardIcon; + /// Asset for the the idle character animation. + AssetGenImage get animation; + @override List get props => [ name, ballColor, - character, background, icon, leaderboardIcon, + animation, ]; } diff --git a/packages/pinball_theme/lib/src/themes/dash_theme.dart b/packages/pinball_theme/lib/src/themes/dash_theme.dart index 9038f2fc..7584c8ed 100644 --- a/packages/pinball_theme/lib/src/themes/dash_theme.dart +++ b/packages/pinball_theme/lib/src/themes/dash_theme.dart @@ -14,9 +14,6 @@ class DashTheme extends CharacterTheme { @override Color get ballColor => Colors.blue; - @override - AssetGenImage get character => Assets.images.dash.character; - @override AssetGenImage get background => Assets.images.dash.background; @@ -25,4 +22,7 @@ class DashTheme extends CharacterTheme { @override AssetGenImage get leaderboardIcon => Assets.images.dash.leaderboardIcon; + + @override + AssetGenImage get animation => Assets.images.dash.animation; } diff --git a/packages/pinball_theme/lib/src/themes/dino_theme.dart b/packages/pinball_theme/lib/src/themes/dino_theme.dart index b434463e..3baf466c 100644 --- a/packages/pinball_theme/lib/src/themes/dino_theme.dart +++ b/packages/pinball_theme/lib/src/themes/dino_theme.dart @@ -14,9 +14,6 @@ class DinoTheme extends CharacterTheme { @override Color get ballColor => Colors.grey; - @override - AssetGenImage get character => Assets.images.dino.character; - @override AssetGenImage get background => Assets.images.dino.background; @@ -25,4 +22,7 @@ class DinoTheme extends CharacterTheme { @override AssetGenImage get leaderboardIcon => Assets.images.dino.leaderboardIcon; + + @override + AssetGenImage get animation => Assets.images.dino.animation; } diff --git a/packages/pinball_theme/lib/src/themes/sparky_theme.dart b/packages/pinball_theme/lib/src/themes/sparky_theme.dart index 9e71bef8..7884a22f 100644 --- a/packages/pinball_theme/lib/src/themes/sparky_theme.dart +++ b/packages/pinball_theme/lib/src/themes/sparky_theme.dart @@ -14,9 +14,6 @@ class SparkyTheme extends CharacterTheme { @override String get name => 'Sparky'; - @override - AssetGenImage get character => Assets.images.sparky.character; - @override AssetGenImage get background => Assets.images.sparky.background; @@ -25,4 +22,7 @@ class SparkyTheme extends CharacterTheme { @override AssetGenImage get leaderboardIcon => Assets.images.sparky.leaderboardIcon; + + @override + AssetGenImage get animation => Assets.images.sparky.animation; } diff --git a/packages/share_repository/.gitignore b/packages/share_repository/.gitignore new file mode 100644 index 00000000..526da158 --- /dev/null +++ b/packages/share_repository/.gitignore @@ -0,0 +1,7 @@ +# See https://www.dartlang.org/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.packages +build/ +pubspec.lock \ No newline at end of file diff --git a/packages/share_repository/README.md b/packages/share_repository/README.md new file mode 100644 index 00000000..0473707b --- /dev/null +++ b/packages/share_repository/README.md @@ -0,0 +1,11 @@ +# share_repository + +[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link] +[![License: MIT][license_badge]][license_link] + +Repository to facilitate sharing scores. + +[license_badge]: https://img.shields.io/badge/license-MIT-blue.svg +[license_link]: https://opensource.org/licenses/MIT +[very_good_analysis_badge]: https://img.shields.io/badge/style-very_good_analysis-B22C89.svg +[very_good_analysis_link]: https://pub.dev/packages/very_good_analysis \ No newline at end of file diff --git a/packages/share_repository/analysis_options.yaml b/packages/share_repository/analysis_options.yaml new file mode 100644 index 00000000..3742fc3d --- /dev/null +++ b/packages/share_repository/analysis_options.yaml @@ -0,0 +1 @@ +include: package:very_good_analysis/analysis_options.2.4.0.yaml \ No newline at end of file diff --git a/packages/share_repository/lib/share_repository.dart b/packages/share_repository/lib/share_repository.dart new file mode 100644 index 00000000..0b6d064c --- /dev/null +++ b/packages/share_repository/lib/share_repository.dart @@ -0,0 +1,3 @@ +library share_repository; + +export 'src/share_repository.dart'; diff --git a/packages/share_repository/lib/src/share_repository.dart b/packages/share_repository/lib/src/share_repository.dart new file mode 100644 index 00000000..6c1f36d0 --- /dev/null +++ b/packages/share_repository/lib/src/share_repository.dart @@ -0,0 +1,7 @@ +/// {@template share_repository} +/// Repository to facilitate sharing scores. +/// {@endtemplate} +class ShareRepository { + /// {@macro share_repository} + const ShareRepository(); +} diff --git a/packages/share_repository/pubspec.yaml b/packages/share_repository/pubspec.yaml new file mode 100644 index 00000000..dc3d4e86 --- /dev/null +++ b/packages/share_repository/pubspec.yaml @@ -0,0 +1,13 @@ +name: share_repository +description: Repository to facilitate sharing scores. +version: 1.0.0+1 +publish_to: none + +environment: + sdk: ">=2.16.0 <3.0.0" + +dev_dependencies: + coverage: ^1.1.0 + mocktail: ^0.2.0 + test: ^1.19.2 + very_good_analysis: ^2.4.0 diff --git a/packages/share_repository/test/src/share_repository_test.dart b/packages/share_repository/test/src/share_repository_test.dart new file mode 100644 index 00000000..e6cc536b --- /dev/null +++ b/packages/share_repository/test/src/share_repository_test.dart @@ -0,0 +1,11 @@ +// ignore_for_file: prefer_const_constructors +import 'package:share_repository/share_repository.dart'; +import 'package:test/test.dart'; + +void main() { + group('ShareRepository', () { + test('can be instantiated', () { + expect(ShareRepository(), isNotNull); + }); + }); +} diff --git a/pubspec.lock b/pubspec.lock index 31aed6af..1a502f37 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,14 +7,14 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "39.0.0" + version: "31.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "2.8.0" args: dependency: transitive description: @@ -71,6 +71,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.5" clock: dependency: transitive description: @@ -314,7 +321,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.4" + version: "0.6.3" json_annotation: dependency: transitive description: @@ -349,7 +356,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.1.3" meta: dependency: transitive description: @@ -412,7 +419,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.0" path_provider: dependency: transitive description: @@ -585,7 +592,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" + version: "1.8.1" stack_trace: dependency: transitive description: @@ -627,21 +634,21 @@ packages: name: test url: "https://pub.dartlang.org" source: hosted - version: "1.21.1" + version: "1.19.5" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.8" test_core: dependency: transitive description: name: test_core url: "https://pub.dartlang.org" source: hosted - version: "0.4.13" + version: "0.4.9" typed_data: dependency: transitive description: @@ -662,7 +669,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" + version: "2.1.1" very_good_analysis: dependency: "direct dev" description: diff --git a/test/game/components/controlled_sparky_computer_test.dart b/test/game/components/controlled_sparky_computer_test.dart deleted file mode 100644 index 6ba21a44..00000000 --- a/test/game/components/controlled_sparky_computer_test.dart +++ /dev/null @@ -1,38 +0,0 @@ -// ignore_for_file: cascade_invocations - -import 'package:flame_test/flame_test.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:pinball/game/game.dart'; - -import '../../helpers/helpers.dart'; - -void main() { - group('ControlledSparkyComputer', () { - TestWidgetsFlutterBinding.ensureInitialized(); - final flameTester = FlameTester(EmptyPinballTestGame.new); - - flameTester.test('loads correctly', (game) async { - final sparkyComputer = ControlledSparkyComputer(); - await game.ensureAdd(sparkyComputer); - expect(game.children, contains(sparkyComputer)); - }); - - flameTester.testGameWidget( - 'SparkyTurboChargeSensorBallContactCallback turbo charges the ball', - setUp: (game, tester) async { - final contackCallback = SparkyComputerSensorBallContactCallback(); - final sparkyTurboChargeSensor = MockSparkyComputerSensor(); - final ball = MockControlledBall(); - final controller = MockBallController(); - - when(() => ball.controller).thenReturn(controller); - when(controller.turboCharge).thenAnswer((_) async {}); - - contackCallback.begin(sparkyTurboChargeSensor, ball, MockContact()); - - verify(() => ball.controller.turboCharge()).called(1); - }, - ); - }); -} diff --git a/test/game/components/sparky_fire_zone_test.dart b/test/game/components/sparky_fire_zone_test.dart index 4c3fcdb9..e2bc08b3 100644 --- a/test/game/components/sparky_fire_zone_test.dart +++ b/test/game/components/sparky_fire_zone_test.dart @@ -8,6 +8,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; import '../../helpers/helpers.dart'; @@ -20,29 +21,50 @@ void main() { Assets.images.sparky.bumper.b.inactive.keyName, Assets.images.sparky.bumper.c.active.keyName, Assets.images.sparky.bumper.c.inactive.keyName, + Assets.images.sparky.animatronic.keyName, ]; final flameTester = FlameTester(() => EmptyPinballTestGame(assets)); group('SparkyFireZone', () { - flameTester.test( - 'loads correctly', - (game) async { - final sparkyFireZone = SparkyFireZone(); - await game.ensureAdd(sparkyFireZone); - - expect(game.contains(sparkyFireZone), isTrue); - }, - ); + flameTester.test('loads correctly', (game) async { + final sparkyFireZone = SparkyFireZone(); + await game.ensureAdd(sparkyFireZone); + }); group('loads', () { + flameTester.test( + 'a SparkyComputer', + (game) async { + expect( + SparkyFireZone().blueprints.whereType().single, + isNotNull, + ); + }, + ); + + flameTester.test( + 'a SparkyAnimatronic', + (game) async { + final sparkyFireZone = SparkyFireZone(); + await game.addFromBlueprint(sparkyFireZone); + await game.ready(); + + expect( + game.descendants().whereType().single, + isNotNull, + ); + }, + ); + flameTester.test( 'three SparkyBumper', (game) async { final sparkyFireZone = SparkyFireZone(); - await game.ensureAdd(sparkyFireZone); + await game.addFromBlueprint(sparkyFireZone); + await game.ready(); expect( - sparkyFireZone.descendants().whereType().length, + game.descendants().whereType().length, equals(3), ); }, @@ -84,11 +106,11 @@ void main() { setUp: (game, tester) async { final ball = Ball(baseColor: const Color(0xFF00FFFF)); final sparkyFireZone = SparkyFireZone(); - await game.ensureAdd(sparkyFireZone); + await game.addFromBlueprint(sparkyFireZone); await game.ensureAdd(ball); game.addContactCallback(BallScorePointsCallback(game)); - final bumpers = sparkyFireZone.descendants().whereType(); + final bumpers = sparkyFireZone.components.whereType(); for (final bumper in bumpers) { beginContact(game, bumper, ball); @@ -102,4 +124,40 @@ void main() { ); }); }); + + group('SparkyTurboChargeSensorBallContactCallback', () { + flameTester.test('calls turboCharge', (game) async { + final callback = SparkyComputerSensorBallContactCallback(); + final ball = MockControlledBall(); + final controller = MockBallController(); + when(() => ball.controller).thenReturn(controller); + when(() => ball.gameRef).thenReturn(game); + when(controller.turboCharge).thenAnswer((_) async {}); + + callback.begin(MockSparkyComputerSensor(), ball, MockContact()); + + verify(() => ball.controller.turboCharge()).called(1); + }); + + flameTester.test('plays SparkyAnimatronic', (game) async { + final callback = SparkyComputerSensorBallContactCallback(); + final ball = MockControlledBall(); + final controller = MockBallController(); + when(() => ball.controller).thenReturn(controller); + when(() => ball.gameRef).thenReturn(game); + when(controller.turboCharge).thenAnswer((_) async {}); + + final sparkyFireZone = SparkyFireZone(); + await game.addFromBlueprint(sparkyFireZone); + await game.ready(); + + final sparkyAnimatronic = + sparkyFireZone.components.whereType().single; + + expect(sparkyAnimatronic.playing, isFalse); + callback.begin(MockSparkyComputerSensor(), ball, MockContact()); + + expect(sparkyAnimatronic.playing, isTrue); + }); + }); } diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 4c3dbbfb..aebb31f9 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -34,6 +34,7 @@ void main() { Assets.images.sparky.bumper.b.inactive.keyName, Assets.images.sparky.bumper.c.active.keyName, Assets.images.sparky.bumper.c.inactive.keyName, + Assets.images.sparky.animatronic.keyName, Assets.images.spaceship.ramp.boardOpening.keyName, Assets.images.spaceship.ramp.railingForeground.keyName, Assets.images.spaceship.ramp.railingBackground.keyName, @@ -49,6 +50,7 @@ void main() { Assets.images.flipper.left.keyName, Assets.images.flipper.right.keyName, Assets.images.boundary.outer.keyName, + Assets.images.boundary.outerBottom.keyName, Assets.images.boundary.bottom.keyName, Assets.images.slingshot.upper.keyName, Assets.images.slingshot.lower.keyName, @@ -92,14 +94,6 @@ void main() { ); }); - flameTester.test( - 'one SparkyFireZone', - (game) async { - await game.ready(); - expect(game.children.whereType().length, equals(1)); - }, - ); - flameTester.test( 'one AlienZone', (game) async { diff --git a/test/leaderboard/bloc/leaderboard_state_test.dart b/test/leaderboard/bloc/leaderboard_state_test.dart index ec455f1f..1b5d41d9 100644 --- a/test/leaderboard/bloc/leaderboard_state_test.dart +++ b/test/leaderboard/bloc/leaderboard_state_test.dart @@ -30,7 +30,7 @@ void main() { rank: '1', playerInitials: 'ABC', score: 1500, - character: DashTheme().character, + character: DashTheme().leaderboardIcon, ); test( diff --git a/test/leaderboard/view/leaderboard_page_test.dart b/test/leaderboard/view/leaderboard_page_test.dart index b17c27b8..daacb4a7 100644 --- a/test/leaderboard/view/leaderboard_page_test.dart +++ b/test/leaderboard/view/leaderboard_page_test.dart @@ -121,7 +121,7 @@ void main() { rank: '1', playerInitials: 'ABC', score: 10000, - character: DashTheme().character, + character: DashTheme().leaderboardIcon, ), ], ), diff --git a/web/index.html b/web/index.html index ff6e451b..3e4978d1 100644 --- a/web/index.html +++ b/web/index.html @@ -19,18 +19,18 @@ - + - + - Pinball + I/O Pinball Machine - Flutter @@ -107,4 +107,4 @@ - \ No newline at end of file +