From 0bc597d34f21321dbd96042e963a335d5e1cc5f8 Mon Sep 17 00:00:00 2001 From: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> Date: Thu, 21 Apr 2022 19:09:20 -0500 Subject: [PATCH] feat: add character icon next to initials input (#209) * chore: add icon assets * test: update theme tests * feat: add icon to initials input * fix: remove material design from theme package * refactor: suggestions * refactor: load from cache * chore: remove unawaited * test: update test for caching --- lib/game/components/game_flow_controller.dart | 2 + lib/game/game_assets.dart | 10 ++ .../lib/gen/pinball_fonts.dart | 2 +- .../src/components/backboard/backboard.dart | 4 + .../backboard/backboard_game_over.dart | 144 ++++++++++-------- .../backboard/backboard_letter_prompt.dart | 27 ++-- packages/pinball_components/pubspec.yaml | 2 + .../backboard/backboard_game_over_game.dart | 51 +++++++ ...iting.dart => backboard_waiting_game.dart} | 0 .../lib/stories/backboard/game_over.dart | 37 ----- .../lib/stories/backboard/stories.dart | 11 +- .../pinball_components/sandbox/pubspec.lock | 14 ++ .../pinball_components/sandbox/pubspec.yaml | 2 + .../test/helpers/test_game.dart | 4 +- .../test/src/components/backboard_test.dart | 11 +- .../images/android/leaderboard_icon.png | Bin 0 -> 996 bytes .../assets/images/dash/leaderboard_icon.png | Bin 0 -> 1626 bytes .../assets/images/dino/leaderboard_icon.png | Bin 0 -> 723 bytes .../assets/images/sparky/leaderboard_icon.png | Bin 0 -> 789 bytes .../lib/src/generated/assets.gen.dart | 16 ++ .../lib/src/themes/android_theme.dart | 3 + .../lib/src/themes/character_theme.dart | 4 + .../lib/src/themes/dash_theme.dart | 3 + .../lib/src/themes/dino_theme.dart | 3 + .../lib/src/themes/sparky_theme.dart | 3 + packages/pinball_theme/pubspec.yaml | 1 - .../test/src/themes/android_theme_test.dart | 23 --- .../test/src/themes/dash_theme_test.dart | 23 --- .../test/src/themes/dino_theme_test.dart | 23 --- .../test/src/themes/sparky_theme_test.dart | 23 --- .../components/game_flow_controller_test.dart | 5 + 31 files changed, 237 insertions(+), 214 deletions(-) create mode 100644 packages/pinball_components/sandbox/lib/stories/backboard/backboard_game_over_game.dart rename packages/pinball_components/sandbox/lib/stories/backboard/{waiting.dart => backboard_waiting_game.dart} (100%) delete mode 100644 packages/pinball_components/sandbox/lib/stories/backboard/game_over.dart create mode 100644 packages/pinball_theme/assets/images/android/leaderboard_icon.png create mode 100644 packages/pinball_theme/assets/images/dash/leaderboard_icon.png create mode 100644 packages/pinball_theme/assets/images/dino/leaderboard_icon.png create mode 100644 packages/pinball_theme/assets/images/sparky/leaderboard_icon.png diff --git a/lib/game/components/game_flow_controller.dart b/lib/game/components/game_flow_controller.dart index 957689a9..77afebe6 100644 --- a/lib/game/components/game_flow_controller.dart +++ b/lib/game/components/game_flow_controller.dart @@ -32,6 +32,8 @@ class GameFlowController extends ComponentController // next page component.firstChild()?.gameOverMode( score: state?.score ?? 0, + characterIconPath: + component.theme.characterTheme.leaderboardIcon.keyName, ); component.firstChild()?.focusOnBackboard(); } diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index a1988eda..1cd4f194 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -1,11 +1,17 @@ import 'package:pinball/game/game.dart'; import 'package:pinball/gen/assets.gen.dart'; import 'package:pinball_components/pinball_components.dart' as components; +import 'package:pinball_theme/pinball_theme.dart' hide Assets; /// Add methods to help loading and caching game assets. extension PinballGameAssetsX on PinballGame { /// Returns a list of assets to be loaded List preLoadAssets() { + const dashTheme = DashTheme(); + const sparkyTheme = SparkyTheme(); + const androidTheme = AndroidTheme(); + const dinoTheme = DinoTheme(); + return [ images.load(components.Assets.images.ball.ball.keyName), images.load(components.Assets.images.ball.flameEffect.keyName), @@ -93,6 +99,10 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.googleWord.letter5.keyName), images.load(components.Assets.images.googleWord.letter6.keyName), images.load(components.Assets.images.backboard.display.keyName), + images.load(dashTheme.leaderboardIcon.keyName), + images.load(sparkyTheme.leaderboardIcon.keyName), + images.load(androidTheme.leaderboardIcon.keyName), + images.load(dinoTheme.leaderboardIcon.keyName), images.load(Assets.images.components.background.path), ]; } diff --git a/packages/pinball_components/lib/gen/pinball_fonts.dart b/packages/pinball_components/lib/gen/pinball_fonts.dart index 59dcaa6e..de6c5782 100644 --- a/packages/pinball_components/lib/gen/pinball_fonts.dart +++ b/packages/pinball_components/lib/gen/pinball_fonts.dart @@ -1,6 +1,6 @@ import 'package:pinball_components/gen/fonts.gen.dart'; -const String _fontPath = 'packages/pinball_components/'; +const String _fontPath = 'packages/pinball_components'; /// Class with the fonts available on the pinball game class PinballFonts { diff --git a/packages/pinball_components/lib/src/components/backboard/backboard.dart b/packages/pinball_components/lib/src/components/backboard/backboard.dart index dc3cacb3..fe5fd37c 100644 --- a/packages/pinball_components/lib/src/components/backboard/backboard.dart +++ b/packages/pinball_components/lib/src/components/backboard/backboard.dart @@ -34,12 +34,14 @@ class Backboard extends PositionComponent with HasGameRef { /// Returns a [Backboard] initialized in the game over mode factory Backboard.gameOver({ required Vector2 position, + required String characterIconPath, required int score, required BackboardOnSubmit onSubmit, }) { return Backboard(position: position) ..gameOverMode( score: score, + characterIconPath: characterIconPath, onSubmit: onSubmit, ); } @@ -62,12 +64,14 @@ class Backboard extends PositionComponent with HasGameRef { /// Puts the Backboard in game over mode, where the score input is shown. Future gameOverMode({ required int score, + required String characterIconPath, BackboardOnSubmit? onSubmit, }) async { children.removeWhere((_) => true); await add( BackboardGameOver( score: score, + characterIconPath: characterIconPath, onSubmit: onSubmit, ), ); diff --git a/packages/pinball_components/lib/src/components/backboard/backboard_game_over.dart b/packages/pinball_components/lib/src/components/backboard/backboard_game_over.dart index 98ae6ae0..cfea0bc6 100644 --- a/packages/pinball_components/lib/src/components/backboard/backboard_game_over.dart +++ b/packages/pinball_components/lib/src/components/backboard/backboard_game_over.dart @@ -18,78 +18,41 @@ class BackboardGameOver extends PositionComponent with HasGameRef { /// {@macro backboard_game_over} BackboardGameOver({ required int score, + required String characterIconPath, BackboardOnSubmit? onSubmit, - }) : _score = score, - _onSubmit = onSubmit; + }) : _onSubmit = onSubmit, + super( + children: [ + _BackboardSpriteComponent(), + _BackboardDisplaySpriteComponent(), + _ScoreTextComponent(score.formatScore()), + _CharacterIconSpriteComponent(characterIconPath), + ], + ); - final int _score; final BackboardOnSubmit? _onSubmit; @override Future onLoad() async { - final backgroundSprite = await gameRef.loadSprite( - Assets.images.backboard.backboardGameOver.keyName, - ); - - unawaited( - add( - SpriteComponent( - sprite: backgroundSprite, - size: backgroundSprite.originalSize / 10, - anchor: Anchor.bottomCenter, - ), - ), - ); - - final displaySprite = await gameRef.loadSprite( - Assets.images.backboard.display.keyName, - ); - - unawaited( - add( - SpriteComponent( - sprite: displaySprite, - size: displaySprite.originalSize / 10, - anchor: Anchor.bottomCenter, - position: Vector2(0, -11.5), - ), - ), - ); - - unawaited( - add( - TextComponent( - text: _score.formatScore(), - position: Vector2(-22, -46.5), - anchor: Anchor.center, - textRenderer: Backboard.textPaint, - ), - ), - ); - for (var i = 0; i < 3; i++) { - unawaited( - add( - BackboardLetterPrompt( - position: Vector2( - 20 + (6 * i).toDouble(), - -46.5, - ), - hasFocus: i == 0, + await add( + BackboardLetterPrompt( + position: Vector2( + 24.3 + (4.5 * i), + -45, ), + hasFocus: i == 0, ), ); } - unawaited( - add( - KeyboardInputController( - keyUp: { - LogicalKeyboardKey.arrowLeft: () => _movePrompt(true), - LogicalKeyboardKey.arrowRight: () => _movePrompt(false), - LogicalKeyboardKey.enter: _submit, - }, - ), + await add( + KeyboardInputController( + keyUp: { + LogicalKeyboardKey.arrowLeft: () => _movePrompt(true), + LogicalKeyboardKey.arrowRight: () => _movePrompt(false), + LogicalKeyboardKey.enter: _submit, + }, ), ); } @@ -118,3 +81,64 @@ class BackboardGameOver extends PositionComponent with HasGameRef { return false; } } + +class _BackboardSpriteComponent extends SpriteComponent with HasGameRef { + _BackboardSpriteComponent() : super(anchor: Anchor.bottomCenter); + + @override + Future onLoad() async { + await super.onLoad(); + final sprite = await gameRef.loadSprite( + Assets.images.backboard.backboardGameOver.keyName, + ); + this.sprite = sprite; + size = sprite.originalSize / 10; + } +} + +class _BackboardDisplaySpriteComponent extends SpriteComponent with HasGameRef { + _BackboardDisplaySpriteComponent() + : super( + anchor: Anchor.bottomCenter, + position: Vector2(0, -11.5), + ); + + @override + Future onLoad() async { + await super.onLoad(); + final sprite = await gameRef.loadSprite( + Assets.images.backboard.display.keyName, + ); + this.sprite = sprite; + size = sprite.originalSize / 10; + } +} + +class _ScoreTextComponent extends TextComponent { + _ScoreTextComponent(String score) + : super( + text: score, + anchor: Anchor.centerLeft, + position: Vector2(-34, -45), + textRenderer: Backboard.textPaint, + ); +} + +class _CharacterIconSpriteComponent extends SpriteComponent with HasGameRef { + _CharacterIconSpriteComponent(String characterIconPath) + : _characterIconPath = characterIconPath, + super( + anchor: Anchor.center, + position: Vector2(18.4, -45), + ); + + final String _characterIconPath; + + @override + Future onLoad() async { + await super.onLoad(); + final sprite = Sprite(gameRef.images.fromCache(_characterIconPath)); + this.sprite = sprite; + size = sprite.originalSize / 10; + } +} diff --git a/packages/pinball_components/lib/src/components/backboard/backboard_letter_prompt.dart b/packages/pinball_components/lib/src/components/backboard/backboard_letter_prompt.dart index 61d2074d..fe582210 100644 --- a/packages/pinball_components/lib/src/components/backboard/backboard_letter_prompt.dart +++ b/packages/pinball_components/lib/src/components/backboard/backboard_letter_prompt.dart @@ -34,22 +34,19 @@ class BackboardLetterPrompt extends PositionComponent { @override Future onLoad() async { _underscore = RectangleComponent( - size: Vector2( - 4, - 1.2, - ), + size: Vector2(3.8, 0.8), anchor: Anchor.center, - position: Vector2(0, 4), + position: Vector2(-0.3, 4), ); - unawaited(add(_underscore)); + await add(_underscore); _input = TextComponent( text: 'A', textRenderer: Backboard.textPaint, anchor: Anchor.center, ); - unawaited(add(_input)); + await add(_input); _underscoreBlinker = TimerComponent( period: 0.6, @@ -62,16 +59,14 @@ class BackboardLetterPrompt extends PositionComponent { }, ); - unawaited(add(_underscoreBlinker)); + await add(_underscoreBlinker); - unawaited( - add( - KeyboardInputController( - keyUp: { - LogicalKeyboardKey.arrowUp: () => _cycle(true), - LogicalKeyboardKey.arrowDown: () => _cycle(false), - }, - ), + await add( + KeyboardInputController( + keyUp: { + LogicalKeyboardKey.arrowUp: () => _cycle(true), + LogicalKeyboardKey.arrowDown: () => _cycle(false), + }, ), ); } diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index a14c5296..7df3429a 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -16,6 +16,8 @@ dependencies: intl: ^0.17.0 pinball_flame: path: ../pinball_flame + pinball_theme: + path: ../pinball_theme dev_dependencies: diff --git a/packages/pinball_components/sandbox/lib/stories/backboard/backboard_game_over_game.dart b/packages/pinball_components/sandbox/lib/stories/backboard/backboard_game_over_game.dart new file mode 100644 index 00000000..691b1656 --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/backboard/backboard_game_over_game.dart @@ -0,0 +1,51 @@ +import 'package:flame/components.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; +import 'package:pinball_theme/pinball_theme.dart'; +import 'package:sandbox/common/common.dart'; + +class BackboardGameOverGame extends BasicKeyboardGame { + BackboardGameOverGame(this.score, this.character); + + static const info = ''' + Simple example showing the game over mode of the backboard. + + - Select a character to update the character icon. + '''; + + final int score; + final String character; + + static final characterIconPaths = { + 'Dash': Assets.images.dash.leaderboardIcon.keyName, + 'Sparky': Assets.images.sparky.leaderboardIcon.keyName, + 'Android': Assets.images.android.leaderboardIcon.keyName, + 'Dino': Assets.images.dino.leaderboardIcon.keyName, + }; + + @override + Future onLoad() async { + camera + ..followVector2(Vector2.zero()) + ..zoom = 5; + + await images.loadAll(characterIconPaths.values.toList()); + + await add( + Backboard.gameOver( + position: Vector2(0, 20), + score: score, + characterIconPath: characterIconPaths[character]!, + onSubmit: (initials) { + add( + ScoreText( + text: 'User $initials made $score', + position: Vector2(0, 50), + color: Colors.pink, + ), + ); + }, + ), + ); + } +} diff --git a/packages/pinball_components/sandbox/lib/stories/backboard/waiting.dart b/packages/pinball_components/sandbox/lib/stories/backboard/backboard_waiting_game.dart similarity index 100% rename from packages/pinball_components/sandbox/lib/stories/backboard/waiting.dart rename to packages/pinball_components/sandbox/lib/stories/backboard/backboard_waiting_game.dart diff --git a/packages/pinball_components/sandbox/lib/stories/backboard/game_over.dart b/packages/pinball_components/sandbox/lib/stories/backboard/game_over.dart deleted file mode 100644 index a513276f..00000000 --- a/packages/pinball_components/sandbox/lib/stories/backboard/game_over.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flame/components.dart'; -import 'package:flutter/material.dart'; -import 'package:pinball_components/pinball_components.dart'; -import 'package:sandbox/common/common.dart'; - -class BackboardGameOverGame extends BasicKeyboardGame { - BackboardGameOverGame(this.score); - - static const info = ''' - Simple example showing the waiting mode of the backboard. - '''; - - final int score; - - @override - Future onLoad() async { - camera - ..followVector2(Vector2.zero()) - ..zoom = 5; - - await add( - Backboard.gameOver( - position: Vector2(0, 20), - score: score, - onSubmit: (initials) { - add( - ScoreText( - text: 'User $initials made $score', - position: Vector2(0, 50), - color: Colors.pink, - ), - ); - }, - ), - ); - } -} diff --git a/packages/pinball_components/sandbox/lib/stories/backboard/stories.dart b/packages/pinball_components/sandbox/lib/stories/backboard/stories.dart index f85e6685..cc05ba4f 100644 --- a/packages/pinball_components/sandbox/lib/stories/backboard/stories.dart +++ b/packages/pinball_components/sandbox/lib/stories/backboard/stories.dart @@ -1,8 +1,8 @@ import 'package:dashbook/dashbook.dart'; import 'package:flame/game.dart'; import 'package:sandbox/common/common.dart'; -import 'package:sandbox/stories/backboard/game_over.dart'; -import 'package:sandbox/stories/backboard/waiting.dart'; +import 'package:sandbox/stories/backboard/backboard_game_over_game.dart'; +import 'package:sandbox/stories/backboard/backboard_waiting_game.dart'; void addBackboardStories(Dashbook dashbook) { dashbook.storiesOf('Backboard') @@ -18,7 +18,12 @@ void addBackboardStories(Dashbook dashbook) { 'Game over', (context) => GameWidget( game: BackboardGameOverGame( - context.numberProperty('score', 9000000000).toInt(), + context.numberProperty('Score', 9000000000).toInt(), + context.listProperty( + 'Character', + BackboardGameOverGame.characterIconPaths.keys.first, + BackboardGameOverGame.characterIconPaths.keys.toList(), + ), ), ), codeLink: buildSourceLink('backboard/game_over.dart'), diff --git a/packages/pinball_components/sandbox/pubspec.lock b/packages/pinball_components/sandbox/pubspec.lock index 7f78e365..d7ab8901 100644 --- a/packages/pinball_components/sandbox/pubspec.lock +++ b/packages/pinball_components/sandbox/pubspec.lock @@ -64,6 +64,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + equatable: + dependency: transitive + description: + name: equatable + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" fake_async: dependency: transitive description: @@ -247,6 +254,13 @@ packages: relative: true source: path version: "1.0.0+1" + pinball_theme: + dependency: "direct main" + description: + path: "../../pinball_theme" + relative: true + source: path + version: "1.0.0+1" platform: dependency: transitive description: diff --git a/packages/pinball_components/sandbox/pubspec.yaml b/packages/pinball_components/sandbox/pubspec.yaml index 03a46ee0..dd9f8259 100644 --- a/packages/pinball_components/sandbox/pubspec.yaml +++ b/packages/pinball_components/sandbox/pubspec.yaml @@ -16,6 +16,8 @@ dependencies: path: ../ pinball_flame: path: ../../pinball_flame + pinball_theme: + path: ../../pinball_theme dev_dependencies: flutter_test: diff --git a/packages/pinball_components/test/helpers/test_game.dart b/packages/pinball_components/test/helpers/test_game.dart index 1faf75e8..1f8b9ee6 100644 --- a/packages/pinball_components/test/helpers/test_game.dart +++ b/packages/pinball_components/test/helpers/test_game.dart @@ -17,4 +17,6 @@ class TestGame extends Forge2DGame { } } -class KeyboardTestGame extends TestGame with HasKeyboardHandlerComponents {} +class KeyboardTestGame extends TestGame with HasKeyboardHandlerComponents { + KeyboardTestGame([List? assets]) : super(assets); +} diff --git a/packages/pinball_components/test/src/components/backboard_test.dart b/packages/pinball_components/test/src/components/backboard_test.dart index 5e868bfc..aee2481a 100644 --- a/packages/pinball_components/test/src/components/backboard_test.dart +++ b/packages/pinball_components/test/src/components/backboard_test.dart @@ -5,13 +5,15 @@ import 'package:flame_test/flame_test.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; +import 'package:pinball_theme/pinball_theme.dart'; import '../../helpers/helpers.dart'; void main() { group('Backboard', () { - final tester = FlameTester(KeyboardTestGame.new); + final characterIconPath = Assets.images.dash.leaderboardIcon.keyName; + final tester = FlameTester(() => KeyboardTestGame([characterIconPath])); group('on waitingMode', () { tester.testGameWidget( @@ -20,6 +22,7 @@ void main() { game.camera.zoom = 2; game.camera.followVector2(Vector2.zero()); await game.ensureAdd(Backboard.waiting(position: Vector2(0, 15))); + await tester.pump(); }, verify: (game, tester) async { await expectLater( @@ -39,6 +42,7 @@ void main() { final backboard = Backboard.gameOver( position: Vector2(0, 15), score: 1000, + characterIconPath: characterIconPath, onSubmit: (_) {}, ); await game.ensureAdd(backboard); @@ -52,7 +56,6 @@ void main() { (component) => component is TextComponent && component.text == '1,000', ); - expect(score, isNotNull); }, ); @@ -63,6 +66,7 @@ void main() { final backboard = Backboard.gameOver( position: Vector2(0, 15), score: 1000, + characterIconPath: characterIconPath, onSubmit: (_) {}, ); await game.ensureAdd(backboard); @@ -106,6 +110,7 @@ void main() { final backboard = Backboard.gameOver( position: Vector2(0, 15), score: 1000, + characterIconPath: characterIconPath, onSubmit: (value) { submitedInitials = value; }, diff --git a/packages/pinball_theme/assets/images/android/leaderboard_icon.png b/packages/pinball_theme/assets/images/android/leaderboard_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..238e29efc8f1220f446d45706e883ef3af0e9edf GIT binary patch literal 996 zcmVU-MZGdgv-}8?psZ1Ykx_b?b-LWd(wSx-}mhVSfO{wK)9O~ zw|gK=$nZM)S-n6L#ssq@S*s?WSe1s`cUFy#%A(ypx2R3?};_h2o4h75V@LMc1VO zURLfG294U={PUe){H}~)FL;li^u59+ZJTQ*zj2fgu{2^*Af#Z62!0;g)=D&s2bV&6C_b~hIh`O;G>>>KY~re*JP{@$g) zF8pgeds&Ac2pd)8s9bCq{}m5^hd=nuHHzQ37J@Gj`G)ZuPalFWnBAn^WYJ;P#-HBk zryMxWXqhm4!MxUwXU7wacI{EpJj^<{y&9Bp!c_J6nfhCtt*1K5cf;;hoK9nHyp1X` z)hEHsCf3HKc_8!;Nu3W6ptqg`svfg)sGUBF{(WjWZ4D-Em9|YdL)=13fe-a9`#$?z z!ct=t(aO>Tnbd-fbdr&-ln-G<8-^2X8sG$Z(IVz(HqSL}7(YNS zL>u*os6o(JslpIMXKES2>h5ayT(vqG?_QurqK$?^s0_o>VMdyfW=LOv6THN%g=+I$ z7Zf9^cP60KxZ6V7YsAa|Eu1xaVZVjrPclXVQ%%va3V}kB$oOa+=%_}Z_>?8%ALBrK zz>L2)ZfAm#dR8J(P&Y}!=@p>New)^pbSPxJmrBr_jg-~TbQ;F7M0vMU6_r;>@7Ckm z|J`jVKorUNBy~@l19l%@Got!CD(xB~2o$4+@ntGW^DaO2+-rWQWV~f-Cxr_XM~%#_ z_X`m5;@>ZXsYl^_{YG@!%R_5gB`nyNN?iN&Nxzh0>p; SGavT=00004dvbTVOD?<4R#UQ@OEa^RWpnvKLgu-d zXXl@pd1m(6JpndxQTtN%!z+W6M&ZRUY(RodR3IwPCeOYLZgNa`1a%PRv1Sp#!Rwc2 zo4hryrfi?(`4I9HU<)`&45KBRJ=s0i{P8pS&9Dg9h)3F8q2QA^wA|;Dt1;rG+5Jbq zb1C3}OSqIzMi$PXUz@8vIH)@a_-%_452xrLxZvvc&ONOV;s@Xa8o4$PT*52xGt#0n z!rkQBJWvV$TKh2TVI++sa$JK$oRBYRzOdOkg{1P5@TRg-YbxPAou_19MfEBiMpluD zdJ^sHmqh${tdIO&CE<6KYE-;{oFGQ}N&}VfA*SVVhYl*Nl!()Ei}qRAY|mh>=ZNrH z^FrBhlk%(9u1qF(9>O}L*n6vGpRh|_C>zG{?sNq?5@B5u)wM0cApEbcGL%+fT{6~R zW+)qk4~~<$pBpiZ8C~0A48lviB#?<%m+0CSV-UV;E8ucrT@u`CEK3))uO8fh7RpD-Y9dS#ACFLr+|-!t^0hh zYUOFFrV6)6IC)=Z(0d+I1Y4Q2p*LgJ_q^^R(g{;PdsBQqM;QaMMl?%pKb=B=@_hS% ze(MRZJEW7UX~a7dd_KE(GF8U}(JXcSE@JazVB;THrZ)`)=9k)de8w1O>;Ta$iK2z% zI!88M%+g%s^vT*(*DTeNlvxSu4M@4EeDxC0`uWm&2VMn^J!devXMyQSEV1$U3^Mk= zfM}K)_Wc1dzK5wHsxroMZ70x?Wv=S>sz!t9lD?i3$l?>0eb%_xly4!L$#$lYOev%A zV$;^Mp`Q#}mehxCFSfW%G59PI*@U}^W@!o@WLS5S8Plptkn~I@%UM^q&sbc%3_cT# z{ZA9kQpdgH@Rov&0n^sgT|*Xb7ALyB*5WqB;IpqDOeBeB>Grj4C_f1{qNb7P*-koH zwzQsZk6OIzVer|P0TV++votkAmJI7uPnpV3AN}u#rYW$m%4219*!_X zuFV6N@QE1Ub7-rZpuEjp4!#%l>&Q0e&^xY~N5KV`@Fxxr_xRkUS-&17sCgkW8MwcG zC5ZD%Hv7iIV?E&U3!Av1eG#5ZzRVr*j};2G^wGBSn24Bt|J7B%HsS3fbtHTH1J)}4 Y0z{FnNN}1WI{*Lx07*qoM6N<$g3>o3w*UYD literal 0 HcmV?d00001 diff --git a/packages/pinball_theme/assets/images/dino/leaderboard_icon.png b/packages/pinball_theme/assets/images/dino/leaderboard_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b103337131f3cb3fdc70d5679480e56de3794e55 GIT binary patch literal 723 zcmV;^0xbQBP)5Yo}QNH`zuPpS}YdxA4LJ*AyIgb{^qa0eRe{K zC0l<14~XEBA9b>qL8@piE^co(Kl|(!ix2ET;pspFsMHivhRDw@R0md-y&&C)t(5Yz z3)4aO9v^C|dLT>(3oo3lfmHE*)I)XPbXsvlgk&*>V6*AB3(;Y#ITpT6TDaDJE)UV+ zg!AsOIS|rCd)oQyFsvMj@L(aI0!sOb3DMy^-lTzaJx*lR^l$Po9i|a3MAGT(`sCzu zuTfotH#T5mllz9B$3x+$ZY!gqc3v;V+^4g=guAF-6bhtFIIJH5?)aJsjQx=tZ92=3 zdkaA z!$-ZyuOoH1DeHS%nhCBgwbRMm^0?Ojr>uFEtj2IZzTHmN{L=pyyfJ+5OO7>PAqpm) zs5YN}Iu`=3Ap%^hUwR(?i9y`a*D{ z=~EJ~L8oxU-Kag@PFXwuf^l;|cvZ=pH|Wu$Z7w2O{{!gRuw1`vcXha9 zhL_aO(Ia<}7veN8nVYk_3fv*|8H!Al1sZ#GFb;PJeTLW(2>Sv}2W}Di4ABw@V_vfQ z**@kj-=UU36H}mXye`_{HO();y?wYt=re@CL@c=79U2K;1`_%Vlb4yHA{gbaP?aD! z*U$)khPcEFOL;WRbEeuY*lIfmcSwBZD3GlFnzh>#oFo#T;}mEBKN!d~A=>Z*q0bOs z;Rgbr+Z_tD1wRn@?5$Iv68u2mvsk4-4fsKWm(>1HpbPK=iO(?#RD>T$d?w!^LE-5d z^Fq*~lKAXWAVD|97y3!p=LggfQP&5V^-fQoASq6#p@zw-wCm#u`BN0gWk343NxD9} z(8B=*T7e#7Wq~#}DbR1IVXsGlYEVO^Anf}1LMfm?Q_w?FZS!@mKNt%19eN0S>iP)S z>5j+*FDtr9*JliBD4wN2vrt2AN?9PBQTE6kP9GEv3fNXQY#;nm_F;`8ZKcmZS#dg9 zQ8sqBdO+RIq{_u%vd=IzfVmrMCFqrLwB^3u1!QtIDB z?-82i34Yn;C=fhO|2s*o3NFtBKL27#FLS1~qmtEwBT70@0A+XRBc9o#O?b**Xwr@T TTXl^(00000NkvXXu0mjf+)G;j literal 0 HcmV?d00001 diff --git a/packages/pinball_theme/lib/src/generated/assets.gen.dart b/packages/pinball_theme/lib/src/generated/assets.gen.dart index 22b6b520..f050c621 100644 --- a/packages/pinball_theme/lib/src/generated/assets.gen.dart +++ b/packages/pinball_theme/lib/src/generated/assets.gen.dart @@ -39,6 +39,10 @@ class $AssetsImagesAndroidGen { /// File path: assets/images/android/icon.png AssetGenImage get icon => const AssetGenImage('assets/images/android/icon.png'); + + /// File path: assets/images/android/leaderboard_icon.png + AssetGenImage get leaderboardIcon => + const AssetGenImage('assets/images/android/leaderboard_icon.png'); } class $AssetsImagesDashGen { @@ -54,6 +58,10 @@ class $AssetsImagesDashGen { /// File path: assets/images/dash/icon.png AssetGenImage get icon => const AssetGenImage('assets/images/dash/icon.png'); + + /// File path: assets/images/dash/leaderboard_icon.png + AssetGenImage get leaderboardIcon => + const AssetGenImage('assets/images/dash/leaderboard_icon.png'); } class $AssetsImagesDinoGen { @@ -69,6 +77,10 @@ class $AssetsImagesDinoGen { /// File path: assets/images/dino/icon.png AssetGenImage get icon => const AssetGenImage('assets/images/dino/icon.png'); + + /// File path: assets/images/dino/leaderboard_icon.png + AssetGenImage get leaderboardIcon => + const AssetGenImage('assets/images/dino/leaderboard_icon.png'); } class $AssetsImagesSparkyGen { @@ -85,6 +97,10 @@ class $AssetsImagesSparkyGen { /// File path: assets/images/sparky/icon.png AssetGenImage get icon => const AssetGenImage('assets/images/sparky/icon.png'); + + /// File path: assets/images/sparky/leaderboard_icon.png + AssetGenImage get leaderboardIcon => + const AssetGenImage('assets/images/sparky/leaderboard_icon.png'); } class Assets { diff --git a/packages/pinball_theme/lib/src/themes/android_theme.dart b/packages/pinball_theme/lib/src/themes/android_theme.dart index 2a59cb61..1001ca5f 100644 --- a/packages/pinball_theme/lib/src/themes/android_theme.dart +++ b/packages/pinball_theme/lib/src/themes/android_theme.dart @@ -22,4 +22,7 @@ class AndroidTheme extends CharacterTheme { @override AssetGenImage get icon => Assets.images.android.icon; + + @override + AssetGenImage get leaderboardIcon => Assets.images.android.leaderboardIcon; } diff --git a/packages/pinball_theme/lib/src/themes/character_theme.dart b/packages/pinball_theme/lib/src/themes/character_theme.dart index 0a81fae8..9c5f6ba6 100644 --- a/packages/pinball_theme/lib/src/themes/character_theme.dart +++ b/packages/pinball_theme/lib/src/themes/character_theme.dart @@ -27,6 +27,9 @@ abstract class CharacterTheme extends Equatable { /// Icon asset. AssetGenImage get icon; + /// Icon asset for the leaderboard. + AssetGenImage get leaderboardIcon; + @override List get props => [ name, @@ -34,5 +37,6 @@ abstract class CharacterTheme extends Equatable { character, background, icon, + leaderboardIcon, ]; } diff --git a/packages/pinball_theme/lib/src/themes/dash_theme.dart b/packages/pinball_theme/lib/src/themes/dash_theme.dart index df6cf363..9038f2fc 100644 --- a/packages/pinball_theme/lib/src/themes/dash_theme.dart +++ b/packages/pinball_theme/lib/src/themes/dash_theme.dart @@ -22,4 +22,7 @@ class DashTheme extends CharacterTheme { @override AssetGenImage get icon => Assets.images.dash.icon; + + @override + AssetGenImage get leaderboardIcon => Assets.images.dash.leaderboardIcon; } diff --git a/packages/pinball_theme/lib/src/themes/dino_theme.dart b/packages/pinball_theme/lib/src/themes/dino_theme.dart index b1a5a32f..b434463e 100644 --- a/packages/pinball_theme/lib/src/themes/dino_theme.dart +++ b/packages/pinball_theme/lib/src/themes/dino_theme.dart @@ -22,4 +22,7 @@ class DinoTheme extends CharacterTheme { @override AssetGenImage get icon => Assets.images.dino.icon; + + @override + AssetGenImage get leaderboardIcon => Assets.images.dino.leaderboardIcon; } diff --git a/packages/pinball_theme/lib/src/themes/sparky_theme.dart b/packages/pinball_theme/lib/src/themes/sparky_theme.dart index 7990e2c3..9e71bef8 100644 --- a/packages/pinball_theme/lib/src/themes/sparky_theme.dart +++ b/packages/pinball_theme/lib/src/themes/sparky_theme.dart @@ -22,4 +22,7 @@ class SparkyTheme extends CharacterTheme { @override AssetGenImage get icon => Assets.images.sparky.icon; + + @override + AssetGenImage get leaderboardIcon => Assets.images.sparky.leaderboardIcon; } diff --git a/packages/pinball_theme/pubspec.yaml b/packages/pinball_theme/pubspec.yaml index 93084cca..57522939 100644 --- a/packages/pinball_theme/pubspec.yaml +++ b/packages/pinball_theme/pubspec.yaml @@ -17,7 +17,6 @@ dev_dependencies: very_good_analysis: ^2.4.0 flutter: - uses-material-design: true generate: true assets: - assets/images/ diff --git a/packages/pinball_theme/test/src/themes/android_theme_test.dart b/packages/pinball_theme/test/src/themes/android_theme_test.dart index 5dd10283..27a06922 100644 --- a/packages/pinball_theme/test/src/themes/android_theme_test.dart +++ b/packages/pinball_theme/test/src/themes/android_theme_test.dart @@ -1,6 +1,5 @@ // ignore_for_file: prefer_const_constructors -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pinball_theme/pinball_theme.dart'; @@ -13,27 +12,5 @@ void main() { test('supports value equality', () { expect(AndroidTheme(), equals(AndroidTheme())); }); - - test('ballColor is correct', () { - expect(AndroidTheme().ballColor, equals(Colors.green)); - }); - - test('character asset is correct', () { - expect( - AndroidTheme().character, - equals(Assets.images.android.character), - ); - }); - - test('background asset is correct', () { - expect( - AndroidTheme().background, - equals(Assets.images.android.background), - ); - }); - - test('icon asset is correct', () { - expect(AndroidTheme().icon, equals(Assets.images.android.icon)); - }); }); } diff --git a/packages/pinball_theme/test/src/themes/dash_theme_test.dart b/packages/pinball_theme/test/src/themes/dash_theme_test.dart index 1180eeb5..16605fb3 100644 --- a/packages/pinball_theme/test/src/themes/dash_theme_test.dart +++ b/packages/pinball_theme/test/src/themes/dash_theme_test.dart @@ -1,6 +1,5 @@ // ignore_for_file: prefer_const_constructors -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pinball_theme/pinball_theme.dart'; @@ -13,27 +12,5 @@ void main() { test('supports value equality', () { expect(DashTheme(), equals(DashTheme())); }); - - test('ballColor is correct', () { - expect(DashTheme().ballColor, equals(Colors.blue)); - }); - - test('character asset is correct', () { - expect( - DashTheme().character, - equals(Assets.images.dash.character), - ); - }); - - test('background asset is correct', () { - expect( - DashTheme().background, - equals(Assets.images.dash.background), - ); - }); - - test('icon asset is correct', () { - expect(DashTheme().icon, equals(Assets.images.dash.icon)); - }); }); } diff --git a/packages/pinball_theme/test/src/themes/dino_theme_test.dart b/packages/pinball_theme/test/src/themes/dino_theme_test.dart index 061ebf8d..45ea0813 100644 --- a/packages/pinball_theme/test/src/themes/dino_theme_test.dart +++ b/packages/pinball_theme/test/src/themes/dino_theme_test.dart @@ -1,6 +1,5 @@ // ignore_for_file: prefer_const_constructors -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pinball_theme/pinball_theme.dart'; @@ -13,27 +12,5 @@ void main() { test('supports value equality', () { expect(DinoTheme(), equals(DinoTheme())); }); - - test('ballColor is correct', () { - expect(DinoTheme().ballColor, equals(Colors.grey)); - }); - - test('character asset is correct', () { - expect( - DinoTheme().character, - equals(Assets.images.dino.character), - ); - }); - - test('background asset is correct', () { - expect( - DinoTheme().background, - equals(Assets.images.dino.background), - ); - }); - - test('icon asset is correct', () { - expect(DinoTheme().icon, equals(Assets.images.dino.icon)); - }); }); } diff --git a/packages/pinball_theme/test/src/themes/sparky_theme_test.dart b/packages/pinball_theme/test/src/themes/sparky_theme_test.dart index bf18211d..ce276938 100644 --- a/packages/pinball_theme/test/src/themes/sparky_theme_test.dart +++ b/packages/pinball_theme/test/src/themes/sparky_theme_test.dart @@ -1,6 +1,5 @@ // ignore_for_file: prefer_const_constructors -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pinball_theme/pinball_theme.dart'; @@ -13,27 +12,5 @@ void main() { test('supports value equality', () { expect(SparkyTheme(), equals(SparkyTheme())); }); - - test('ballColor is correct', () { - expect(SparkyTheme().ballColor, equals(Colors.orange)); - }); - - test('character asset is correct', () { - expect( - SparkyTheme().character, - equals(Assets.images.sparky.character), - ); - }); - - test('background asset is correct', () { - expect( - SparkyTheme().background, - equals(Assets.images.sparky.background), - ); - }); - - test('icon asset is correct', () { - expect(SparkyTheme().icon, equals(Assets.images.sparky.icon)); - }); }); } diff --git a/test/game/components/game_flow_controller_test.dart b/test/game/components/game_flow_controller_test.dart index b9a6181a..4efc7174 100644 --- a/test/game/components/game_flow_controller_test.dart +++ b/test/game/components/game_flow_controller_test.dart @@ -5,6 +5,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_theme/pinball_theme.dart'; import '../../helpers/helpers.dart'; @@ -43,6 +44,7 @@ void main() { when( () => backboard.gameOverMode( score: any(named: 'score'), + characterIconPath: any(named: 'characterIconPath'), onSubmit: any(named: 'onSubmit'), ), ).thenAnswer((_) async {}); @@ -55,6 +57,8 @@ void main() { when(game.firstChild).thenReturn(backboard); when(game.firstChild).thenReturn(cameraController); when(() => game.overlays).thenReturn(overlays); + when(() => game.theme) + .thenReturn(PinballTheme(characterTheme: DashTheme())); }); test( @@ -71,6 +75,7 @@ void main() { verify( () => backboard.gameOverMode( score: 0, + characterIconPath: any(named: 'characterIconPath'), onSubmit: any(named: 'onSubmit'), ), ).called(1);