From b6ef9f73f664007eb8fc3f965ca8e5adee17388e Mon Sep 17 00:00:00 2001 From: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> Date: Fri, 6 May 2022 21:05:51 -0500 Subject: [PATCH] feat: provide and listen to `CharacterThemeCubit` in game (#375) * feat: connect game ball to theme selection * chore: swap out ball assets * chore: swap out flipper assets * fix: ball spawn layer * refactor: use readBloc and fix tests * refactor: update ball sprite only --- .../behaviors/ball_spawning_behavior.dart | 6 +- lib/game/behaviors/ball_theming_behavior.dart | 20 ++++ lib/game/behaviors/behaviors.dart | 1 + .../flutter_forest_bonus_behavior.dart | 11 ++- .../components/game_bloc_status_listener.dart | 6 +- lib/game/pinball_game.dart | 25 +++-- lib/game/view/pinball_game_page.dart | 7 +- .../assets/images/flipper/left.png | Bin 7031 -> 10032 bytes .../assets/images/flipper/right.png | Bin 7134 -> 10699 bytes .../lib/src/components/ball/ball.dart | 63 ++++++++---- .../ball/behaviors/ball_scaling_behavior.dart | 11 ++- .../src/components/ball/cubit/ball_cubit.dart | 15 +++ .../src/components/ball/cubit/ball_state.dart | 14 +++ .../chrome_dino_chomping_behavior.dart | 2 +- .../chrome_dino_spitting_behavior.dart | 2 +- packages/pinball_components/pubspec.yaml | 1 + .../pinball_components/sandbox/pubspec.lock | 28 ++++++ .../test/src/components/ball/ball_test.dart | 36 +++++++ .../behaviors/ball_scaling_behavior_test.dart | 4 +- .../ball/cubit/ball_cubit_test.dart | 18 ++++ .../ball/cubit/ball_state_test.dart | 22 +++++ .../chrome_dino_chomping_behavior_test.dart | 5 +- .../chrome_dino_spitting_behavior_test.dart | 9 +- .../test/src/components/golden/flipper.png | Bin 38704 -> 38979 bytes .../assets/images/android/ball.png | Bin 6544 -> 9731 bytes .../pinball_theme/assets/images/dash/ball.png | Bin 6561 -> 9542 bytes .../pinball_theme/assets/images/dino/ball.png | Bin 6973 -> 9404 bytes .../assets/images/sparky/ball.png | Bin 6449 -> 9821 bytes .../ball_spawning_behavior_test.dart | 17 ++-- .../behaviors/ball_theming_behavior_test.dart | 93 ++++++++++++++++++ .../flutter_forest_bonus_behavior_test.dart | 19 ++-- .../game_bloc_status_listener_test.dart | 24 ++--- test/game/pinball_game_test.dart | 17 +++- test/game/view/pinball_game_page_test.dart | 3 +- 34 files changed, 394 insertions(+), 85 deletions(-) create mode 100644 lib/game/behaviors/ball_theming_behavior.dart create mode 100644 packages/pinball_components/lib/src/components/ball/cubit/ball_cubit.dart create mode 100644 packages/pinball_components/lib/src/components/ball/cubit/ball_state.dart create mode 100644 packages/pinball_components/test/src/components/ball/cubit/ball_cubit_test.dart create mode 100644 packages/pinball_components/test/src/components/ball/cubit/ball_state_test.dart rename test/game/{components/android_acres => }/behaviors/ball_spawning_behavior_test.dart (90%) create mode 100644 test/game/behaviors/ball_theming_behavior_test.dart diff --git a/lib/game/behaviors/ball_spawning_behavior.dart b/lib/game/behaviors/ball_spawning_behavior.dart index 75656d8f..8995c16b 100644 --- a/lib/game/behaviors/ball_spawning_behavior.dart +++ b/lib/game/behaviors/ball_spawning_behavior.dart @@ -1,9 +1,9 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; -import 'package:pinball_theme/pinball_theme.dart'; /// Spawns a new [Ball] into the game when all balls are lost and still /// [GameStatus.playing]. @@ -23,7 +23,9 @@ class BallSpawningBehavior extends Component void onNewState(GameState state) { final plunger = gameRef.descendants().whereType().single; final canvas = gameRef.descendants().whereType().single; - final characterTheme = readProvider(); + final characterTheme = readBloc() + .state + .characterTheme; final ball = Ball(assetPath: characterTheme.ball.keyName) ..initialPosition = Vector2( plunger.body.position.x, diff --git a/lib/game/behaviors/ball_theming_behavior.dart b/lib/game/behaviors/ball_theming_behavior.dart new file mode 100644 index 00000000..5e12a720 --- /dev/null +++ b/lib/game/behaviors/ball_theming_behavior.dart @@ -0,0 +1,20 @@ +import 'package:flame/components.dart'; +import 'package:flame_bloc/flame_bloc.dart'; +import 'package:pinball/select_character/select_character.dart'; +import 'package:pinball_components/pinball_components.dart'; + +/// Updates the launch [Ball] to reflect character selections. +class BallThemingBehavior extends Component + with + FlameBlocListenable, + HasGameRef { + @override + void onNewState(CharacterThemeState state) { + gameRef + .descendants() + .whereType() + .single + .bloc + .onThemeChanged(state.characterTheme); + } +} diff --git a/lib/game/behaviors/behaviors.dart b/lib/game/behaviors/behaviors.dart index c7ad6880..301bc61e 100644 --- a/lib/game/behaviors/behaviors.dart +++ b/lib/game/behaviors/behaviors.dart @@ -1,4 +1,5 @@ export 'ball_spawning_behavior.dart'; +export 'ball_theming_behavior.dart'; export 'bonus_noise_behavior.dart'; export 'bumper_noise_behavior.dart'; export 'camera_focusing_behavior.dart'; diff --git a/lib/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior.dart b/lib/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior.dart index 55902eb7..c94cda60 100644 --- a/lib/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior.dart +++ b/lib/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior.dart @@ -1,9 +1,9 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; -import 'package:pinball_theme/pinball_theme.dart'; /// Bonus obtained at the [FlutterForest]. /// @@ -41,11 +41,12 @@ class FlutterForestBonusBehavior extends Component if (signpost.bloc.isFullyProgressed()) { bloc.add(const BonusActivated(GameBonus.dashNest)); - final characterTheme = readProvider(); + final characterTheme = + readBloc() + .state + .characterTheme; canvas.add( - Ball( - assetPath: characterTheme.ball.keyName, - ) + Ball(assetPath: characterTheme.ball.keyName) ..initialPosition = Vector2(29.2, -24.5) ..zIndex = ZIndexes.ballOnBoard, ); diff --git a/lib/game/components/game_bloc_status_listener.dart b/lib/game/components/game_bloc_status_listener.dart index 6e11f3d6..81da96d5 100644 --- a/lib/game/components/game_bloc_status_listener.dart +++ b/lib/game/components/game_bloc_status_listener.dart @@ -1,9 +1,9 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_flame/pinball_flame.dart'; -import 'package:pinball_theme/pinball_theme.dart'; /// Listens to the [GameBloc] and updates the game accordingly. class GameBlocStatusListener extends Component @@ -26,7 +26,9 @@ class GameBlocStatusListener extends Component readProvider().play(PinballAudio.gameOverVoiceOver); gameRef.descendants().whereType().first.requestInitials( score: state.displayScore, - character: readProvider(), + character: readBloc() + .state + .characterTheme, ); break; } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 6818f566..6f1aa630 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -11,15 +11,15 @@ import 'package:leaderboard_repository/leaderboard_repository.dart'; import 'package:pinball/game/behaviors/behaviors.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball/l10n/l10n.dart'; +import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; -import 'package:pinball_theme/pinball_theme.dart'; class PinballGame extends PinballForge2DGame with HasKeyboardHandlerComponents, MultiTouchTapDetector { PinballGame({ - required CharacterTheme characterTheme, + required CharacterThemeCubit characterThemeBloc, required this.leaderboardRepository, required GameBloc gameBloc, required AppLocalizations l10n, @@ -27,7 +27,7 @@ class PinballGame extends PinballForge2DGame }) : focusNode = FocusNode(), _gameBloc = gameBloc, _player = player, - _characterTheme = characterTheme, + _characterThemeBloc = characterThemeBloc, _l10n = l10n, super( gravity: Vector2(0, 30), @@ -43,7 +43,7 @@ class PinballGame extends PinballForge2DGame final FocusNode focusNode; - final CharacterTheme _characterTheme; + final CharacterThemeCubit _characterThemeBloc; final PinballPlayer _player; @@ -56,13 +56,19 @@ class PinballGame extends PinballForge2DGame @override Future onLoad() async { await add( - FlameBlocProvider.value( - value: _gameBloc, + FlameMultiBlocProvider( + providers: [ + FlameBlocProvider.value( + value: _gameBloc, + ), + FlameBlocProvider.value( + value: _characterThemeBloc, + ), + ], children: [ MultiFlameProvider( providers: [ FlameProvider.value(_player), - FlameProvider.value(_characterTheme), FlameProvider.value(leaderboardRepository), FlameProvider.value(_l10n), ], @@ -70,6 +76,7 @@ class PinballGame extends PinballForge2DGame BonusNoiseBehavior(), GameBlocStatusListener(), BallSpawningBehavior(), + BallThemingBehavior(), CameraFocusingBehavior(), CanvasComponent( onSpritePainted: (paint) { @@ -161,13 +168,13 @@ class PinballGame extends PinballForge2DGame class DebugPinballGame extends PinballGame with FPSCounter, PanDetector { DebugPinballGame({ - required CharacterTheme characterTheme, + required CharacterThemeCubit characterThemeBloc, required LeaderboardRepository leaderboardRepository, required AppLocalizations l10n, required PinballPlayer player, required GameBloc gameBloc, }) : super( - characterTheme: characterTheme, + characterThemeBloc: characterThemeBloc, player: player, leaderboardRepository: leaderboardRepository, l10n: l10n, diff --git a/lib/game/view/pinball_game_page.dart b/lib/game/view/pinball_game_page.dart index 1005c728..354d61ed 100644 --- a/lib/game/view/pinball_game_page.dart +++ b/lib/game/view/pinball_game_page.dart @@ -31,21 +31,20 @@ class PinballGamePage extends StatelessWidget { @override Widget build(BuildContext context) { - final characterTheme = - context.read().state.characterTheme; + final characterThemeBloc = context.read(); final player = context.read(); final leaderboardRepository = context.read(); final gameBloc = context.read(); final game = isDebugMode ? DebugPinballGame( - characterTheme: characterTheme, + characterThemeBloc: characterThemeBloc, player: player, leaderboardRepository: leaderboardRepository, l10n: context.l10n, gameBloc: gameBloc, ) : PinballGame( - characterTheme: characterTheme, + characterThemeBloc: characterThemeBloc, player: player, leaderboardRepository: leaderboardRepository, l10n: context.l10n, diff --git a/packages/pinball_components/assets/images/flipper/left.png b/packages/pinball_components/assets/images/flipper/left.png index 3aefa22501c66ec3a47ccc1927d9f68d9a7f87e9..190b5bb0937a9f1d0faf54fa262af3eb275c780f 100644 GIT binary patch literal 10032 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 V(J)v|wgUhF002ovPDHLkV1jd^Nelo0 diff --git a/packages/pinball_components/assets/images/flipper/right.png b/packages/pinball_components/assets/images/flipper/right.png index 3627c86c4cac25f21b596b326bf0505f678e765b..6bc4658042110e03091bc38b395c5e7e50d3a374 100644 GIT binary patch literal 10699 zcmd6N2{@E(-?yDCg^(nTQML?b%nZiP*q7}4Hk+N%7<=}}no3zhcA-S}>?GMUwjxBb zL{TI~@{a26xu5rY?)QF<_j|u(4l{FI=lMVX>+io@hlw*Z&}3ocVWgm-VA0k>8k4_M z$!}=}I`ZebN_8pu>xj3Ol@A34)A7SMCB^M5ZVC$KZC6uEqNTnb0)zJyM`7`3oOpnz zH<_A(LS8Ar8-;Pl5dmnNv#XZ^aHFXW2yn$J04-qplKS3iI2Tu~AOg-L$iNg60+6iiPb)mVf3x-S`Q<6H&m;m+-V$JO$wRAt5MnXE>AZaj9zTR* zF%mcroF~qU=tHIj|EBeJ!4vU5F8IG-{d@bL1dzR}um4-dztqLk^S1~eqPid1j9(7< zm()I{f!;U?W1J7(mw>^k`;pZY_`@0>qA~6t{`@zNlgWP{Cb~NP#o5E1e=-Ue;QAM& zhdaMXy%A~z9Eyl1nBwssf56A^4=(~BQsPnoVSNf0F9sv93;me

2B;lrDI06bqK%oCbN`^8PMMV8AF&2Yx z!V^4EVSL{LkdW;xS|% z|B#AP*5ol8V8pJ;iS;gQcy`43=V_-!R-RUm7M=5k3Vxg)Cx=H z2nT~?a{VH^6%K<*!G5h9x(47p zERn8c@A&*wM2c+Zk0U>}tp2nGl{qX9Kk^Ns&n9w@FT?#D9leA zFoyuekt6YQ+4WyU^565>&-4B+II_3?3)uc7^T9h2{ZRy*iZj{8|3+d+{FVAXD8K(& zc?cFGiG%7A3BQnDZ!Fb<6ZJ3%2b7;+5$SLJ^u5(FV7L;m|Ck^Xzi z|Kg5uL3ugj$n8i1_}@1N1A)SvoTM-yS-3P51jWE)$@rCqfZ)>7Qg8?uN6tAiRR7u> z7#JZ1{=a4p2JhvEBm4vs|OYqw!>1lK>|;LlQis{r^Pl=ru&gJZBz6ofngKo4sTR7MsCLZh%?G6>OF9E@BS zF)(t5|Nj!EzcmL6M}u*2axF)rCCRlMB2C60N?H~qDUFkX!=)r)5G=VD{FOQXsT=(t zPom!;|3jreOKli7f_sE|a ztZ`TqehhJlf7OZpT^y39Is|!w_?wvmij{=RfF&^?I9L`%o+O}X5DF!Y2FXgnF_KQ? zJvjOYst>v0|95AK!;=5Q4SyQk|5zeF4IEznei9+y{C<|fd67E?f&8RG_k`vH1qJUV zZKR56z|{L}_r$Z$eP10cPivaB-CcgvG;K%FHoD=uiW0f8X?)Z2j0aOC_8ercJp%RA zDC>nvcbONMI{adSxa*YrReQ(+@hRqe3^LG|m?JMK>Y%j3_= zf}izXSzUko_U)awlXiXRnwFAsO@A|sS9|w-zAtClzzWL(J_LPed?gV?F%k8gx{|M% zFMNA$TkYt?l{mhd&SQpQ%?3|fDkc`BfXCW{qLfv4z6JyhY|}fos5s_f-s$>(wS&@& z1$BLU00^d-a5ySPOkR6RRed412RT4<*YG%!(&ZT7oNxq1WN|)(?#3(=Rw>bO=GczZ zGr!wgEdps$;R45L`#sqE&Vz8b?mE>=mULhVC5?_DXopu1gTdv8yt z+%08{azC`EVrC%doxXMHml|6*+&7#uC{W2`rg^&2cP*%izQj^Rub`_8XwVKnVT&hL zuBT~aoXB0cf5AqOqUVTMOs@zOnWvmPa8lE3Lo^9mo|^R5f9n!PPI`RNxO!4AZ4G9l z%PaFN|D7L)n|`^G|Gn{>WvOFbwyy_A}E~23-Z8FI@E@$+{DYbXeKrRbkyLm5raMs-K-b-=(HqO31)UYG}`Q+{Cq=ehs zv#rmt6pJy5XD13v1>Sv9wHU*4<`goy7R~CpCza{us^Djbx-3R+72(3ljNtlA+8ERG zZfoL2CX4LZAHv78B381%wqOIdfjl}&qxIlIzJWK1Y!zqusG_DjJ82&?bHl=KFmhjy zEucMh9L15#pmLU^70IBYOyir6mU~`FVw#LLxYN=w+TR-J+p<@iP~m0gPDHm^H4LcD z?}kSCO1BU1u-zaL=nS!FOF?(;slnQ3U8Jg__F>gUERhJrApA?FJBF`77>8E^-9==fzUy9X6Ah9skNCC^%d)0*|UR>#Tx97Rj%;mKC(!Hj7QSYofIT6E|yI3 zr#r^hc8QlFEOc0|`1MHJ$m$K6yR$e{NMEYG(TKc7Y$_5R8q4(cuQG@0UwDl%yh=Lz zW{^;d6jE^Qqb!U_I%fmEb365+G7#5y=~eqZpKi8}>(}O8CV>%PjkqI*K&mK|V^2FP z=EXjA=l~q%WI(#>N}N}O87D^NeEpVy1@|CREQ)xScbp4^L~)(!43tL3o68FP&#!)MMzr_K(s{kfD=A;`*m-hYioS*$vr8)+)6NWM`gdHRAe66g0*0W zh|t4%dfAO;1gkt0%G0MAaDr7lXf+(%)XA_<*5F)zzQYi{RT%q)6z z9qr-0;YpO~xn)n11;y_(k*;Nyo?WrjJepjFu`6i*zAuD0b9@8UNi|57Qrr%m)Rv04 zO1W>()KXcb@M>yOXY;N@%gn)GT29l~=}iN!4SLIzN?!Q;gcyQaw+!$^-oEXy{~IGI zSI-U$cQc#1f#%xGdos|p+r1eYPsHzHMcHL2Q60rHCY!`gO=scyKCC?0>^=!WeQqde z-es?g&Z7tXut-Z!HpPsZpy8OVj67>AbEZymf{M9>>#m-BrMTX(O2u*Fn|QiMIn;BB z(zjOm1<@X-2E#FggX=KTq#>_Rrnb+eP?twB{p1sqQVdw0%q7VF3HN7M4xIX*TVp=5}*JO`l_)&rbQ zDOdBSnW9#`>)$Zc(7DaJ5ATwY+j% z-TC3_EiV0a0+%`bO%gcH$d5N8N%CQ>>I5s>agnIWc5bFRF2`B9lRS;55!RN8nkvK8 zEV`IMt>fYentShFrFFMz2{kUqj>=H1v2qlHg?)D^omgb@M8y5S>BbBeV%Ey4*JMX+ zM-Ba>??)Xi?>F#Wi+1Et3lAu$)0_kF%hjsLG0cR9!9KO zc9LzVFi?)~*i^AlEpU(uopw#VAY^;ZfYQ}An8Z;IdoZbylS#YFZMi2nZWKJq+@2e0 z-ZF);s^!?SWfc%lUm5+j;ncc?{{o2ai1Xh}{)PzGJmd?_9Y#uVZiT z-P+|L#>V#Ih3dQ8z~`zMsv;MLsaKN6lk!dS(+Z|X#6Elqzcl zY4YyHd{E5QK+-VB7Y*|xd!TVv0H0WL{X>da>oI&MMLdv_%5o`W*D0qdEu71aG&Ay9 zy5ilZ@7q$(@FA$hZw3bqjwBjWKbg{K-80%lieE7aZ9!96--E|LqbG%M?H>Rc(y0j@ zM0!PzqAM_Yrxohkkf;24I~V)58=q~G#@=5!$5^bUIMe->%{4lN>Q1qx)VpNSE9Vg> zL(m7oj~M*a+OzGC$ypu6aO0ef9&-6^TxWgEs()mUGyD7Ln#?qRhnCTO|Fnr}rInDt zkUc3N;+SR1gd4A@Q24!UUGrxxM~6b+pxT>23@QwoD4!un~owe zrF`-n7cA?nf?}LjG8ZVMU3;A(N_=AW(gmvI27;1oa;cT|!5a&nQ^{=4Z9JQ+nxbBo z^~5=*8v>t18p)eJK$V-SXRr*U^Pbd5;NQT=eSI)pwSVxv2=DQIYCU?WT!PE@$)ooC zBRk76j*E0fLf`$i6qfm{zKp|sUgLMOQ(`8Ei29FvmMiIaV9ckX%a6H8YSRFHQ{BKA zxmz8{B-#5vNfzF9Y-`P44BHit=l- zvxeK>O=x}@ajeNwCFW^gf{dAKJ9wi>7(GBD-5YVU5Bd5sZ9yn!e|p!s?UttOQOkvi zKFSXiwr$AmWBcDq!*&g8Kl=23E>&LzQFJ|xojO|AU&uQ1+|uNM7BA^V_5Ekfd+)7y zvROCj*^1&E9Rp~hkB)GSM#hN5>+i4^nDCE2WOCOLMMHw*uW2PmZp=0&;XmzOE8-Lr zm&miemv=LjwZJjh{ZwYXS6+Qnv`%Z1bP*rEtRnyQx7M+!E?$M!2Xc$&E9^H`!oG~< zczpZbZ?pfc!Ey3PQ6O1Ltt?MYEx; z(<$e!6~xy;>Y|-=e0i$97TAgmF1Z;ujxzN1VoQfEvhi9U&5t^vol1Xcdr7}}iCrv9 zHetLLHs%JCSthJ4Xl*mQ`t2(f;A;$dcRIMENp!~wY z#`{Sb-=E4}n^~_= z+8=zU6!QJ0f87R`m=ZBMv}5AceqK>>+fKRr0n*+c_DF19mv#kt6zS}8Cq&%&{>LQ} z8zR(f^;-ee)sbKy=K&#h2B_K6hLx~F*Y?$fV1;~W!EtdPYmE^029$#qhkTgxsWqW9 zoxPevuix~h2&eV;Z1K)`osg50lL`AyCGOA|yFNiT>vm*A?jnzG4s&+^3#IwHp3`r1 zm;GD)tM?=v8aWiVm2zxewOCYMS~RWt^5BfaZqr6E`s?wAF|Edz_ZYBO-z6?AWfWV3 zc|Dq`Gh7hdH_j}IFSGRq^?dHtVl$z>9F^*7JB_)zHC(WI%>+6j2@_znz4GMqqk4en z#KW3t1kH=X(@q2-k|LC@NUShee zrsbsK-j#!$po2T0R2!Y!N?#w=<^=9#-aCl&8eh%scVE##)UFq5HgpzvvxLJnQ0aYBQFCKjcA)Lnp7XJnBINO^ySOCNt&V@zH#0#sfg2I z@2kVt>&Y$K7r!kOCe#i^n|a{j*UwW&k!T*j@VP{c7($6iI&X(KIVau{)6i}a=!Tp& zOUNpYb{VpL@m+M`6ZWyugRdoBqJugnddLhKWjn^K5Z+t<` zr*sgP{B6A6KeTAwE2ke1FY(_-y{pq*S)w!o=8F<#dfQK~+_4$%eLX?rk&Y>Os<&2L zO<%A7J?Ku4LGnhSRM#%)dd0d=VoKnH1%{obhqen4M{BUv4aleYdWvJ&9bRowgXJt9 zwrz`)>OKm)XH}-Bfo3-vQI|Lp%DBk(BxSX5`fMLA9 z^4sdXnf*vQ*1E8)7_{r4U>f$;PVk+~OehCx3tD9!8R|fKCQ!wCeKArj1+CmBij|2= zT#Bb^Zy8CtD!N`R)?@qV;mJtLPq}5{yLL*sKuElaMxP&-_x>L+E zbcZ|+-tOT)Z{nM6z(H_csYR6`oh%z&dq;a8TBhGnK3!orWDufvWGv+|fy7YY=7A+fLmR&#S{ezpJ*$v1+NBY?CNB71QsOXCJzG_xsRGrB9<_`wJJc zUWA6RywYZP&M+o&Q=oV5K8GPSCzBaG)y)n(Q{2u@n>d({u5f5* zZl1Xwd@>m)L{UwVSm;XFt!UYsrVri3UwU&o*+Qwoct+k1Qm;z~f=mOWxWJ7y^iv;} zj#9Exa)x`LCcBh5=$D9CGawv3okQt7k!4Zij_?j$;ZJj zdKLoZiDf0uxkYg}c5`2k4wvtn6TFaJ8A-*Ny<(c3ePj4-s`njJI!gMHGQ?BmoIrZH zA@0GN6TKHMr65&S{D+_61+u2Y#dF?ewT*w9Ir#YM&hDFqrfl)6ve3Y(N~{#!3m0}^ z^{3RQJW8JzHbP#LG%a4WRHZB0-}|y?{5n;q)MnFsO%GJL&RU=zGv!gKJ5e*~awQ?> zEN1Qr+D;&snU>m(u|Gf9&n`a#NzaxbOq*qNIzPR$ik2yr3c*5G#>JYz&4Q*;H3;XZ z%$N&zQE|H-ZK!;bdXx1!{mBTCC;-xopPk-Z5}15(4ifKmV_rX(`{>@xv6n{XM@%%# z9hXKf&Ld<#1f{~vjk@k9gdPaKHfEAByLB`>@N4wedxx;4(F^Ad#^E_{#v)HEI}`kk6ur#+^lEM zse$Uo&faPJI0`r8v(e^S`eW@&Bz6$b&RGHv-RO415vr#_I}w> z#l$bQh(EXM=zZhUaooe!Z8+RBw$J{7xZS)ZrJTeh7xIN^_J4sVnyrbsjnu_ zS|HzU?_EqAy6?JaUP%hoE?CzQGVgz2t}m-?On@6L(dgA#YxgDR*x1?IlvY4_ZjD=? zvlA)mjn|!y_wjl{dT>$x@&iv^-^79eM2Zj%KfsOBhTC;agFomV!89Q%^M_=Cp;!YCW||6AXI+we09B z!Sd$K*WFGV{)#(ypM8J+#G<0cJ7?oOmY0B^hc*=RMp3jE#$8Mp>@q#iHxaklsR|{_<$^!a*4J(x& z3@b7yMEZ5CTwCNjo__OqID5Ff@=-?mYoJee*0uLgf;xqkCq#hbGFnNAHEB9|uc-KA zI+pW+U1(m8IBHeYB!G*9n}JU3C|Gz?9`Fo8ted#LLk(p=OAQsR2^f3q!Y&Eq&fj}K zEcqT-uqU*m`B>n*j30(6E}Ra6VOZz#O_s zcMcpJ6vOhz<94XHoRkT?>5}vwDRU8ts4}zDSunS96X4advtZ%;;o#W=i`%+F=3Jw0 zfgJ%B)E8xAQ#VUO^LTGKsh?-UJuo}pY9xA&X|}1j*6TV*o?pO;R;mYL<=iXV9|v;- z4;yix^>UpHHCtE#gAkRHw5Dujk;3X{MImD-+JJD?%WPY~*jOXB0*-Kv(+$SdH0tk& zxmHJ$!nKTQV>@Fbax)?c5ua&$5_r$N08~bVGYOn#xFG^fHY}#n5sXEZuxnBD2`ICD zpbAhv2@o*MQE_K`eR7pO);HER#!$UFy$iw(l>pl{#Sclf(Gt1ldcV?6| zEy27#q0>7@JxrX~fvLbm0ppXO$vj{5#3>_N|MDcgQRbB%t2?9u=M(pmv#e}9 z#3jU1MHh?pM~feNQFgK9&mBLmx7t;7)b+KYK})G%Tq1+kZ?09mDDwJeks;~s2-?I*?u2Jt9jY|Qco_`_(fG)j*CZsE9%|vjdd+3t zn7&gvqBF>eiiPUd>*ijHHz!q@`J+_<8p@?n+!~j;HYtu!$gh&b0IThEds0g=Jks2?Pt`W2J4GjEu3hscJlZiJIuZPv0lMmVQcA1 z<}HnKRC9&MMOoDp`S=};nLbrxPxz%4d)-ru#v^*oHlO2c>W0R&sgDz!km&es;~G8E zNv;a&N;*STQ$~Me)aHaEPpc9U6^%P(S&w$<;I3ihABk+ zDh;9y8%i4c=GIw_qbUZ;td$oOdTIVIDVQX(h{a#;to>_Gj>R z_6m=hP3=m=zMi$hI-kPo*_pbZ6VmQ2xETbxdvv@jv&`StXGpAsJx+s@O=L5ulLjYv zkx`OPl10~n@${83zYbgX!gS$iB^z_wt1L@w=I)>g6urz1}M}UBv7( zg?*f6vKZ-?wtlfyX>#6CN$VLvVg0f5TScm%Hhy_xCZrmY!VPEqkn68SNr+oG6Y}ci z?ZK3O76${K?!9<+vnoLGXg{&kY1B!e6kg`qVyw+G(L{I3=7e`kEK*8R-H&d9r*Ojf ziSJYF>u zeVY6~20eeuogBGJ&vHMQa--qFmr%6;F@1lI%c=#LkSiJRNGiJF-N$!zY(ZZEl~xQl zmsQmGSa+>1ZDuErKR2j=UMe*`4lfczK3{Wo@vSn{?kN{f>u1^~OrFyg5zh3JP8%%u za(8z2FIX*o-||e_KPbEZ1m0^pV6iX8YuZ(402~|3atnbVG7wVRUbD000P?b4y-7D@iRsU`a$lRCt{2d|S*V*>%>p*511==YGzA>A!o%GoE-bo*`q5EU+z^STYVG z35bA^Vp&!qSt5c5Kz`#P${RvLC_EzZ06g#lh#-WmkVL-Q#2(N15>K4zw%gNl>+b39 z|Nfs#)!ut89_n1`)PMee#utK#dbLiUs@iMc*829h)~>4a0}th)Jd}s>P#(%dc_=@9 zq5szdcqo@kJGIox4D~t*2HjkrfAO9IfU`u-FcN2A4dKCYp+C)j9|Gh5vZRhFPYv}u z36J_YZ}n6C^0)4UJhj|wCwA0JldXQ147!O)EaI2Hb8j-}rukMcYmfR#d(gI7o&bdp z<;~ZNnYAYGwp`w68J8!3Wz0g5qgURTJb3>4VWEJEs7#9}(=z_pV0j3PA5pq3M_av= zc80lr^ZEm%&d{ir*zG}{>}|EuQO}z3r1U?yJ>|Wve6%}AcLp8P%N)2YV>})UgiUYQ zwO2YRbuEdBUbXaOmARi}xRP7s7SI?FBr+3m+gKTzB#u~7Xr$8^X%YjxD8)#amXK3X zJrLD5N-wWWrtziIX}ozFx9^X6 zYmjGGMtOU8ly$edE`@r1<&7d{S-QJ3bdL^NJaUjUcy&=s-=*|uE5lW%aOxR|&KbiU zW2Hyzdx&5P$&@t#GdX5Sl_Y_{!dqB4ZIqY`E2Pqh8J}65+F{S`QkHy5{jtf{|4u z(UT+CflG1K+HlQ85c?#srq&v65lfpCDS2nCrqLLy%wQ-O!o+G|U_itGDHIA)0>EHm z7%)Htg#Zip5n=g{2&w|b%C`i9&QFB`1OWkFJ*Kh5)R#Ox9#e7SU>5%1jidPa*B{JY zymjaF_~m=kc$p1ZH|#i`7O}kk>KI#n z*V*YOy{%r-?Y5Fcg?0Z#G_vV$b?voY&ZC4RiC#Gb&d8aaEW;xyX~qGhfsKLf7)M)% zbx2X#?30;6qSl&(2#$m-N6Qu|j4?_~fD#cH3V1g zS!#*8IrFGz?9L!DgO0@)zjIRb+w8V`wzV@%JKO!F-A>7dQo^nKMd)?h?pDw3^)l`| zf{UKH49GdbZY#spj5#OIgkTJ@?byU@vyp8R;i$9)t0Oj?8iSlvGYVu)OvIQZvSlW~ zkPwj=vT!ig0gSmv7(~^|CZfv8svw%L+J;dtQ6tiP3 zaOB77Lo4&2{&#}cyE+k*&QT%gO=?%BI^ra8YDLB_)${VAjBv2z`^tu64L#yb&sG zU}a`QEjH99rJOxG6Rl@sl?@wWG9-pM8e+9D&MFxK=591FU@~B104AtvwX%t;)lIbU z`?}?84q36m93wSPDX?B2>&`=?tllo+Vqn#;H;?OWY?K&K%+4?iM>01UyH)9%fn78|m`Yk8l{J|OeZFbvzm+uXe&Zy&B2{Ye2Dn(dF zyZz*`L2h?5GHvmkDloLEKAt(cmPBW%w8~@>VswnrJ}X-6jp1kuVgokhnAlMyCeLKm zfSeH+CJ+$`SLDqW##(>@)oMD#^VQ7+oqLU-ODeCNf8OzRrq?C~G_6kSMX0IJhWg9Z ztQR}A*~MkDX-G|3FvsFpVni&bDE)~}^TV@))PLs7FCP8Y=e~Xahd!=D^-^HGZ97e_ z472W)K{DLxB)yiUw3tOY@?}0~+qVxgd#y#b%YjoB>ao*3=jd%oG%e#@WM#{STZXx9 z)TAaDW8j1n2R2Nk#E@zQ6I-xhDCyjhRkB57Dn~Pcw3c=)=p3|iXf5bASJ5VCD9#&r zaV~FSoMycRV^FRCO-@_u^8(gr_OYpMz5Ql0o5I?%EfqvxVpi_!S$qG%fs6m?v)?}c zS6}+>y}R``Y;#~wUNPpWYlHSwc<)_%gO3bd`feAg1JO1c*|M2lbxK>-JI^I68%mf> zW{4B^%%)&sYlW;KA|_G>vw<-d+_C_(Sx%Z3v|V4S7g%L3463sEhGCZN&C3?owN|HD zm)AO4H!n55o6=1D>JE^LloomyEOR1&8X>DbQJ%M@x;b1mfzkvg0Z?KXmm<{xMPF`p z)1$xfzNZF%bbEjDKYnogtX$}>0pl-RW&78j96Y||I={4+_J6Gx(kEPOs`^2vTO{^0wc+J5ft{`A)3KF1Omqc-vTpKd?(M6dS`ulem?YnAzyOLJypiHN|) zR>_*F_S&=v=yNL9n)&M!ZVqbGN^2gk8=jWe)6lIPT03vDMm^j$!9y#1H9M%YMBT;;AgUq)2qN=72n@h7FBiw!Fo==ZHcFr7oqYD! zua3f}pMHDq^=GdimcSesAAV2DdxP|`cU|lKzz1iC;b*+cz!cx-I&YS)h(j+ zICi=7FErqW^QLSnqopg)Utbwn&(ERJ<~p04=ld1hRvdN_ZDXmsUVpjrX?48TehmOi zK+NsQR4c2s7e#Oy0uE*~oRl8MFj~%{Z7q69f|MAh!Po@Auz@SOl(vtagve7*>}AhB zdmSYJn0`j|q4#vRpV;ku^wG}NZ+518qb%!!ZI$$KEx}u`LH)RCv}W&X2@}-}f_0kX z^=jvg+l={}R_z5tScZyKdpa*`{;StG@91^b*<60vIF`qB{&-=RWlmiKNRxT$JDVa# z+&&xQPYw@ob2h^pFfB*II|4Ix^@1JnVqu6divd#}(c_WM5G`ZC^V)*Su51WqmTPxs{7!55>i1rqJOBXO&d3fr z?x~)2?{sIWVOr1Co0D&{Kz$zd=%V!k)Z$?y%z&`W#OpEiGJ`I4vF`Ay-&M$18#fkA zv0B#)C)2W|zM^QY#^PE%S*?$(K8||d_3}%@WOK3`C}}-!QykA`xOsMl2i76&c9G{f z(liADm`$ee(+Lj4DeUY78C#_7KA6`RfhxhUBN9ojZM!GBsd?eFh-#T(vXtMJ!gP(; zjpMs$4x7&Far4{?sGTq8-Sqkf6f_;YNqs#}*qr2^?@HI8aDKI~QreX+t=Z@zfGiqo zj$sMl3k-ab-J6eDBr5KYC%7kq*47S2+gs>#yU4Q~F$#{4j&be|Yk&1W3-7G;eY>UGzHPd)uSf93o*>dbqt>qWhqE$VZs+eAcg>`Q2t zVK^FMXJ-f9ZWqour~-MOA;y4WHbGFvLv6@z%_B$vV`{@MKQ&!m_TDdZW83yRnMQ$0Iv|ps5uzhlPuBd2G_v}%g)ozXIY$LSY~qO zA!63RuxT}HUUeJ7$OfY{SHjvlttrl#Z`Jk&P+S($n#WC@i^jS*f2(cRL2;4pV$5%) zd^tB-Vq;CevJ+ve-9dln3f#^PB1))Mxkp)+I6OSS`0NBGmKYhuPOA-Di&ra#QZT6o zl1br>|8HNqRRRFtIYj99c96H-xVtk$cQi$60K?VYGP8KjF~7yS_|%QJMwJ`RFEhj@ z`mKkY+QL~Ht7)YA_hn)4Tt9Q&=FPQ>?vPgX7aX(R(|Tfh@i;CUTfMv)j+P;Jsi#QG z8QKT;G0fW-_O?JuC}#yGXD67P96-j0=!XfONK;(v_F%Z0scMziD1fLDYGxWE?lIHM z%6E z`x)f5n>aHTc;s!E6%(8u-N)&j+t3GhF+4lMj&b<8{x&*UR<)t)bMsmtCX-l-zFY*k zAEmOeJ)B5<`MCS1?|k&hJFR5$4$ck|9SpF2*hP8PMo}mVA5n&g(hJH`suxmKA&Za5 z@>@{>2v{UHI#05yYxNgLnugj)({vtSi*kbs`R6KaNaEJrN*k+e$^q7$x&qYd!QJNY z(F`v%|6k{e>ay2A&xN%OImV)#iz)Qx3n*{jf--|DkGm%mTpv(ed~XpL^xM^gr~>GkIcuC8KZV z+};QBQ;0gK80h>P>X3+q78x|8ppZa(3N0N-QWT{kdPPwxd;m%hM9+wxAX2ePh!H^q zK_X&|%kz5JScI-6n5YJf4R5+E>hb(!8A&!o0GeBOQ>a?DMGZDu>qVEqTr_;%Y3u9$ zJbRp9{dM3shCH{)W$dAF1UP50c$-48zEBjk`Kq8SPNDr1csn>aJqa(KO-^Quwk-gB z_RC+F#~!)%(ii@?|8K%y{wwAky{mt#qc3D+Zj+%&6_`lotty}fDi*2+Py-SJ2!qJN z_yq7N+CG7X1QHxHBnTma1VZ$LP!eLakeGs_1)_xr;6nux9|J;+D1#sbfsYEzU)WWx z!d8@s7%N7qoU}4$Gkh(LTQlm~)6ANo>z>#Mm}MX9=bLzEy}qs;HS>>6VQhWy>tk)! zxhQwpRHmv3#SA6xgWAw(=)ZpV@ZbmIS@h@U3gE*Ze82m^d*A(z_dWCWkH70G{hd+z z;ECKkXc?Rl(-|9_5o1a#phT>2837f5Y{e{MpgR8njdFD@SZGWUeF_ze7%fyRf>htp z^Aac=3^XQH9RbP^5kiCyiVzhN85#{l2s#f{K`LOy7*U1*A7%a{9bFovVj+P_^IeK& z@T$49matut(wwii=9rZWn*nB%yjed@a5Y(|&J^{YBnmW}5D8!fqya#zhN%&-)sM2Q8UTdaOJI;_Akjg@B1#3W zs18vKG#aGAB9{s@8Vpn|AQmwi#0UgWfG{*Vn9u^E1*t_DLItWA;6sEDvILgQlW0|i zNSw1!gpYAfxs{oPbd}A|e@jva%SFlRrhUxjtmHgI>dw53VHQDZQ=jL?CJOO0cz++d zbq2G&B@?>x^3izq)oJN{P4)cC!1oW1^bf!C-0@4VKlZi99@%@boo8DFv_&gJmoVDZbpNYGdTNyI{;Lx>Kdj3@>+TDa&yVu4_QXknrS z!C>qILJ(*mNOXv?0wDzpkqRJH4pfCU9|B4rAhi&sx&X~8A8I;9m+o6UYiXvi=UHL( zOlEWLQFHgk5OfZHB2b+{k|SVH!tVA_CVP{j$e+9W;O@5$PbP9{{Wp`}{?tFRF~*jN znseWRlcKe)iD@MsMtpnM9C1vL9_~MQL3GgggIEm z0MS4qAqoMJA%P*Dps^|=u~2Wol0c%M488)&GQJ9|0qRA-c{Pi?Achcm39PW6Lm8y_j8Ti+~^i2^0biCDcwq{Qzx8NXsB3 zZHO6ap`HDEN5#Lrb^GW)e&+Mf-g@QE{hy36eq8zZul_QH7@de15wSi5E=x~ES*VKW zZ~VQFZ1=nEEo013MEfC1y9_Ze%a{)GA{(`0r=L-;mDypMxGihV7PH+UmXyeYNr)L_ znXI*xI769Xb(rT7z=Gzh@TD4;KNHva3a>yBp(=<{?Sw=Yc}N8uKq112zDj~)RKzG1 zz@pAWkpY4tPA1UOLn9zk-8GKFh=HJ`g1kTr0ep3j2W$}7K)@AA27;6d^%2Tcfr<%Y z7^(ykfP4ff0*L?#pbU@^Xi`GE5t1;}r4Z{7xdoxNmXe*lapZsZ_Jfmu{oNa{UjO|s zJ?ESL`ZEK@o5_2gekYY7koSSgvP9{*^Pimm4^#eiJ$_i)t@$q9#F5) zARy7@!;A`wsMxC%Xb`B(b2I}`!VqEzDHH-R0?Hi3Fe0=HuSgM)K#)ig-Gjq3eDT>A zZvBg+)5-V#`yYJu94LUFAz=Kt^6MY{WjiZNTNIv)vgD%lm=>iLMX8_oyC3R2dTn>h zS~Czq&xhD9eaH$Ql7wTj+jrez*Y!KO8)b>za@On`W3DjMkTfvCGb0dFGzQTzg@j2` zodcr+L$&>-dEO)QJH1jXUxa{)S?26Ae{`(%kI?+i@tk3F0iFn*r(c2!GZpX8^9Y%T zNKge@7$_{F+KS!aG^m|UO8UY6N&NKZzw!Nl|9fBf`VS|w^1}V{|M$SSOn&|^zJscr zgr}k?QIuXo2qYrG^xJ;$lz$ zf6jsNRZDjRj{athzK+SDohYVkVFB-91M#`2MS%}J)}z@EW(c>MpaQz ztiYinEJ3IU5oca_GA{Y<{&DfSlkx0-KR7P0|IxQ^y#B?neP`p}!)VGwVEl;k3-5mq z`4GsLfkTWGqacb3Blp=}c#{Qpb~N{0D#Yy}g}LcSvMp#5x;N~lLrtkgv zcj%wocm+3JdhIO(Vj&NK@iQXt`AbjIY*x~=C^4DNP?V*Xg~zP)`l(O;symy^lEdRM z_K!|w|L`Op9-qe3@kD;(?|;O+^x7Nz^6U5F?Ry7ufB)!52EjvlC=cbK{ABWf0J^j0 UOOo{klK=n!07*qoM6N<$f_QDNWdHyG diff --git a/packages/pinball_components/lib/src/components/ball/ball.dart b/packages/pinball_components/lib/src/components/ball/ball.dart index e8cea997..49e4f0e0 100644 --- a/packages/pinball_components/lib/src/components/ball/ball.dart +++ b/packages/pinball_components/lib/src/components/ball/ball.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flame/components.dart'; +import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -8,27 +9,27 @@ import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_theme/pinball_theme.dart' as theme; export 'behaviors/behaviors.dart'; +export 'cubit/ball_cubit.dart'; /// {@template ball} /// A solid, [BodyType.dynamic] sphere that rolls and bounces around. /// {@endtemplate} class Ball extends BodyComponent with Layered, InitialPosition, ZIndex { /// {@macro ball} - Ball({ - String? assetPath, - }) : super( + Ball({String? assetPath}) : this._(bloc: BallCubit(), assetPath: assetPath); + + Ball._({required this.bloc, String? assetPath}) + : super( renderBody: false, children: [ - _BallSpriteComponent(assetPath: assetPath), + FlameBlocProvider.value( + value: bloc, + children: [BallSpriteComponent(assetPath: assetPath)], + ), BallScalingBehavior(), BallGravitatingBehavior(), ], ) { - // TODO(ruimiguel): while developing Ball can be launched by clicking mouse, - // and default layer is Layer.all. But on final game Ball will be always be - // be launched from Plunger and LauncherRamp will modify it to Layer.board. - // We need to see what happens if Ball appears from other place like nest - // bumper, it will need to explicit change layer to Layer.board then. layer = Layer.board; } @@ -36,11 +37,22 @@ class Ball extends BodyComponent with Layered, InitialPosition, ZIndex { /// /// This can be used for testing [Ball]'s behaviors in isolation. @visibleForTesting - Ball.test() - : super( - children: [_BallSpriteComponent()], + Ball.test({ + BallCubit? bloc, + String? assetPath, + }) : bloc = bloc ?? BallCubit(), + super( + children: [ + FlameBlocProvider.value( + value: bloc ?? BallCubit(), + children: [BallSpriteComponent(assetPath: assetPath)], + ) + ], ); + /// Bloc to update the ball sprite when a new character is selected. + final BallCubit bloc; + /// The size of the [Ball]. static final Vector2 size = Vector2.all(4.13); @@ -76,21 +88,32 @@ class Ball extends BodyComponent with Layered, InitialPosition, ZIndex { } } -class _BallSpriteComponent extends SpriteComponent with HasGameRef { - _BallSpriteComponent({ - this.assetPath, - }) : super( - anchor: Anchor.center, - ); +/// {@template ball_sprite_component} +/// Visual representation of the [Ball]. +/// {@endtemplate} +@visibleForTesting +class BallSpriteComponent extends SpriteComponent + with HasGameRef, FlameBlocListenable { + /// {@macro ball_sprite_component} + BallSpriteComponent({required String? assetPath}) + : _assetPath = assetPath, + super(anchor: Anchor.center); + + final String? _assetPath; - final String? assetPath; + @override + void onNewState(BallState state) { + sprite = Sprite( + gameRef.images.fromCache(state.characterTheme.ball.keyName), + ); + } @override Future onLoad() async { await super.onLoad(); final sprite = Sprite( gameRef.images - .fromCache(assetPath ?? theme.Assets.images.dash.ball.keyName), + .fromCache(_assetPath ?? theme.Assets.images.dash.ball.keyName), ); this.sprite = sprite; size = sprite.originalSize / 12.5; diff --git a/packages/pinball_components/lib/src/components/ball/behaviors/ball_scaling_behavior.dart b/packages/pinball_components/lib/src/components/ball/behaviors/ball_scaling_behavior.dart index 7fc06fb1..e1e7c405 100644 --- a/packages/pinball_components/lib/src/components/ball/behaviors/ball_scaling_behavior.dart +++ b/packages/pinball_components/lib/src/components/ball/behaviors/ball_scaling_behavior.dart @@ -16,9 +16,12 @@ class BallScalingBehavior extends Component with ParentIsA { parent.body.fixtures.first.shape.radius = (Ball.size.x / 2) * scaleFactor; - parent.firstChild()!.scale.setValues( - scaleFactor, - scaleFactor, - ); + final ballSprite = parent.descendants().whereType(); + if (ballSprite.isNotEmpty) { + ballSprite.single.scale.setValues( + scaleFactor, + scaleFactor, + ); + } } } diff --git a/packages/pinball_components/lib/src/components/ball/cubit/ball_cubit.dart b/packages/pinball_components/lib/src/components/ball/cubit/ball_cubit.dart new file mode 100644 index 00000000..e3054e33 --- /dev/null +++ b/packages/pinball_components/lib/src/components/ball/cubit/ball_cubit.dart @@ -0,0 +1,15 @@ +// ignore_for_file: public_member_api_docs + +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:pinball_theme/pinball_theme.dart'; + +part 'ball_state.dart'; + +class BallCubit extends Cubit { + BallCubit() : super(const BallState.initial()); + + void onThemeChanged(CharacterTheme characterTheme) { + emit(BallState(characterTheme: characterTheme)); + } +} diff --git a/packages/pinball_components/lib/src/components/ball/cubit/ball_state.dart b/packages/pinball_components/lib/src/components/ball/cubit/ball_state.dart new file mode 100644 index 00000000..17a7aa9d --- /dev/null +++ b/packages/pinball_components/lib/src/components/ball/cubit/ball_state.dart @@ -0,0 +1,14 @@ +// ignore_for_file: public_member_api_docs + +part of 'ball_cubit.dart'; + +class BallState extends Equatable { + const BallState({required this.characterTheme}); + + const BallState.initial() : this(characterTheme: const DashTheme()); + + final CharacterTheme characterTheme; + + @override + List get props => [characterTheme]; +} diff --git a/packages/pinball_components/lib/src/components/chrome_dino/behaviors/chrome_dino_chomping_behavior.dart b/packages/pinball_components/lib/src/components/chrome_dino/behaviors/chrome_dino_chomping_behavior.dart index eff84ff4..a8435ec0 100644 --- a/packages/pinball_components/lib/src/components/chrome_dino/behaviors/chrome_dino_chomping_behavior.dart +++ b/packages/pinball_components/lib/src/components/chrome_dino/behaviors/chrome_dino_chomping_behavior.dart @@ -14,7 +14,7 @@ class ChromeDinoChompingBehavior extends ContactBehavior { super.beginContact(other, contact); if (other is! Ball) return; - other.firstChild()!.setOpacity(0); + other.descendants().whereType().single.setOpacity(0); parent.bloc.onChomp(other); } } diff --git a/packages/pinball_components/lib/src/components/chrome_dino/behaviors/chrome_dino_spitting_behavior.dart b/packages/pinball_components/lib/src/components/chrome_dino/behaviors/chrome_dino_spitting_behavior.dart index 78a8b9d5..876dd4d6 100644 --- a/packages/pinball_components/lib/src/components/chrome_dino/behaviors/chrome_dino_spitting_behavior.dart +++ b/packages/pinball_components/lib/src/components/chrome_dino/behaviors/chrome_dino_spitting_behavior.dart @@ -30,7 +30,7 @@ class ChromeDinoSpittingBehavior extends Component void _spit() { parent.bloc.state.ball! - ..firstChild()!.setOpacity(1) + ..descendants().whereType().single.setOpacity(1) ..body.linearVelocity = Vector2(-50, 0); parent.bloc.onSpit(); } diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index 3fffaa88..758ebe37 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -9,6 +9,7 @@ environment: dependencies: bloc: ^8.0.3 flame: ^1.1.1 + flame_bloc: ^1.4.0 flame_forge2d: git: url: https://github.com/flame-engine/flame diff --git a/packages/pinball_components/sandbox/pubspec.lock b/packages/pinball_components/sandbox/pubspec.lock index 0357656d..b5ac88b7 100644 --- a/packages/pinball_components/sandbox/pubspec.lock +++ b/packages/pinball_components/sandbox/pubspec.lock @@ -106,6 +106,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.1" + flame_bloc: + dependency: transitive + description: + name: flame_bloc + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" flame_forge2d: dependency: "direct main" description: @@ -120,6 +127,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_bloc: + dependency: transitive + description: + name: flutter_bloc + url: "https://pub.dartlang.org" + source: hosted + version: "8.0.1" flutter_colorpicker: dependency: transitive description: @@ -214,6 +228,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.7.0" + nested: + dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" ordered_set: dependency: transitive description: @@ -298,6 +319,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.2.4" + provider: + dependency: transitive + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.2" shared_preferences: dependency: transitive description: diff --git a/packages/pinball_components/test/src/components/ball/ball_test.dart b/packages/pinball_components/test/src/components/ball/ball_test.dart index 9195e0b2..43454342 100644 --- a/packages/pinball_components/test/src/components/ball/ball_test.dart +++ b/packages/pinball_components/test/src/components/ball/ball_test.dart @@ -1,5 +1,6 @@ // ignore_for_file: cascade_invocations +import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -39,6 +40,41 @@ void main() { }, ); + flameTester.test( + 'has only one SpriteComponent', + (game) async { + final ball = Ball(); + await game.ready(); + await game.ensureAdd(ball); + + expect( + ball.descendants().whereType().length, + equals(1), + ); + }, + ); + + flameTester.test( + 'BallSpriteComponent changes sprite onNewState', + (game) async { + final ball = Ball(); + await game.ready(); + await game.ensureAdd(ball); + + final ballSprite = + ball.descendants().whereType().single; + final originalSprite = ballSprite.sprite; + + ballSprite.onNewState( + const BallState(characterTheme: theme.DinoTheme()), + ); + await game.ready(); + + final newSprite = ballSprite.sprite; + expect(newSprite != originalSprite, isTrue); + }, + ); + group('adds', () { flameTester.test('a BallScalingBehavior', (game) async { final ball = Ball(); diff --git a/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart b/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart index bd0cca49..c4c66d4a 100644 --- a/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart +++ b/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart @@ -62,8 +62,8 @@ void main() { await game.ensureAddAll([ball1, ball2]); game.update(1); - final sprite1 = ball1.firstChild()!; - final sprite2 = ball2.firstChild()!; + final sprite1 = ball1.descendants().whereType().single; + final sprite2 = ball2.descendants().whereType().single; expect( sprite1.scale.x, greaterThan(sprite2.scale.x), diff --git a/packages/pinball_components/test/src/components/ball/cubit/ball_cubit_test.dart b/packages/pinball_components/test/src/components/ball/cubit/ball_cubit_test.dart new file mode 100644 index 00000000..c5a03213 --- /dev/null +++ b/packages/pinball_components/test/src/components/ball/cubit/ball_cubit_test.dart @@ -0,0 +1,18 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_theme/pinball_theme.dart'; + +void main() { + group( + 'BallCubit', + () { + blocTest( + 'onThemeChanged emits new theme', + build: BallCubit.new, + act: (bloc) => bloc.onThemeChanged(const DinoTheme()), + expect: () => [const BallState(characterTheme: DinoTheme())], + ); + }, + ); +} diff --git a/packages/pinball_components/test/src/components/ball/cubit/ball_state_test.dart b/packages/pinball_components/test/src/components/ball/cubit/ball_state_test.dart new file mode 100644 index 00000000..1163ba1e --- /dev/null +++ b/packages/pinball_components/test/src/components/ball/cubit/ball_state_test.dart @@ -0,0 +1,22 @@ +// ignore_for_file: prefer_const_constructors + +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_theme/pinball_theme.dart'; + +void main() { + group('BallState', () { + test('supports value equality', () { + expect( + BallState(characterTheme: DashTheme()), + equals(const BallState(characterTheme: DashTheme())), + ); + }); + + group('constructor', () { + test('can be instantiated', () { + expect(const BallState(characterTheme: DashTheme()), isNotNull); + }); + }); + }); +} diff --git a/packages/pinball_components/test/src/components/chrome_dino/behaviors/chrome_dino_chomping_behavior_test.dart b/packages/pinball_components/test/src/components/chrome_dino/behaviors/chrome_dino_chomping_behavior_test.dart index dfc33967..f5fd2b42 100644 --- a/packages/pinball_components/test/src/components/chrome_dino/behaviors/chrome_dino_chomping_behavior_test.dart +++ b/packages/pinball_components/test/src/components/chrome_dino/behaviors/chrome_dino_chomping_behavior_test.dart @@ -61,7 +61,10 @@ void main() { behavior.beginContact(ball, contact); - expect(ball.firstChild()!.getOpacity(), isZero); + expect( + ball.descendants().whereType().single.getOpacity(), + isZero, + ); verify(() => bloc.onChomp(ball)).called(1); }, diff --git a/packages/pinball_components/test/src/components/chrome_dino/behaviors/chrome_dino_spitting_behavior_test.dart b/packages/pinball_components/test/src/components/chrome_dino/behaviors/chrome_dino_spitting_behavior_test.dart index 8c2cbe57..0748040e 100644 --- a/packages/pinball_components/test/src/components/chrome_dino/behaviors/chrome_dino_spitting_behavior_test.dart +++ b/packages/pinball_components/test/src/components/chrome_dino/behaviors/chrome_dino_spitting_behavior_test.dart @@ -66,7 +66,14 @@ void main() { .timer .onTick!(); - expect(ball.firstChild()!.getOpacity(), equals(1)); + expect( + ball + .descendants() + .whereType() + .single + .getOpacity(), + equals(1), + ); expect(ball.body.linearVelocity, equals(Vector2(-50, 0))); }, ); diff --git a/packages/pinball_components/test/src/components/golden/flipper.png b/packages/pinball_components/test/src/components/golden/flipper.png index 07fe81edef651e835f3349112e22515aba0f3c35..8507618d1efba2146cb426353d6548863e1baa7a 100644 GIT binary patch literal 38979 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 literal 38704 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

+mD02ML;PLWechiLB4N<{DnKOH;-tv z!vTuER%JiGp4rVdZ*9FloaLRt-@86fH3@gcAXt|_SoXPL?!*2b_c%V@!Di`oivTqE z+`yP$Pj00t3w)-K`ilkH`UAoD6z%`T1B=SsI__J$@-3IAj#@)%%LViRg2aNr`hbkV z0>iJyk0NvR$>{YX3|wCjV#+4EEd7?jmO_Aa)ckxj0dyO}1O|f)V#5j`Hb88E*kH8* zXvz2y2*^D`?h#@G#0G%C+qr^kdm~+8Fqb=MRNOHLwzq~2f(nA_r!xegSlmj7w{tlV zcOdRS+_A9W*K{07?dQSEcflN7We9w7iXXV-%r(J}d{i4PgR<48qC`hz$@M zAU0UZ04*6-ARzY$xko5~`q3*uY=GDRu>oQOK;ZxH3O0MClQw(ApN+HNi;ho3aSolj F{2!7>`1Sw* diff --git a/packages/pinball_theme/assets/images/android/ball.png b/packages/pinball_theme/assets/images/android/ball.png index b5cfbc3ff3df86e10a37b2126d7a67a3f0c8fb96..ca2eebe316c1e07a527a1950bced2fd1a8ba9067 100644 GIT binary patch delta 8148 zcmb7pcQ~7G+dr}Q-qftBHb_M5JxYw))Q(7uiWzG5E@~E~Xi=+1QLFY=wW^fbl%l1m zy=v8Z_4|F^=Q*C=dY@m8%9NC6U4)Gc%$|8?og4lljGsxQE6$a8D9PC z|M`&;U#;2+8k4kxe=SK4L`{1o^YiieVgDdFXUrdf zndy%p3K0<#{ci;A=lmB!_DA>&Nzw=T%1D64;KmS187N!^A_W$M$%u*l(eRMbMdOeT zNE}iPi9^ftLB*g@u-LyHeny}#01<~tV(igkU~wriF)$1&4FlWTizC4hF(g!4!d@DN z!AK|J2yXFzcP}FkByb#YozNC1FT7*ufr#0!vFn zAYgkWT1?`qD=;YtR8I6CCV2jq{x&Q6FC+hZ07;aD#sdFI50aFLn3K{8?e$RZZoX(Q z9NK}8#~Y{ai<9v{dLglB9NNoUo)6>Yj^%O2A|2799&V02ICmbThli^(>aV7W`noxY z{FR-^KSN4dAe0rrKu`{F3v|wVpp?48YL+ShNF=Xm<0Ta3(%`8^|yw5Qa=HQ;D16; zKGCGlL`s0{>y~ajJof8aYRblb)0-LoZyn5n=M^0rwJR#-FEHG3L&Pd7x9LFwbcfd= zzSj}FBr!@GQC>u58C48@H!sMG5nsrPlNlDu#EQEFQ|;^{SvhYJ+lM6HP9UVyWQTNa z?9aWdKk_}D^L}`;==*N<==CX9oFE@z?X%W4d2|T0)+?T$pAT-I4Q^Xq=W98hKGl8~ z^-cYeC@6^T+Y>z7pv?nxuY5?mo3y7w|n$%bLHP7ySYCDD5!j6Uyq(6-nfQXDJ_zPr)vyf9uN zON%hp9@REj?;y*@ltpMy@3*C8SfpC}ZCL^bQ{MCbYpcuf_K4atnG9=H!j-l^RA-fu zSx`A`=ZyB3z@FZ4#$A)X_$6+8*5Ro5py_n!T+sYsq!PNK^`I87sLo)P*yHGYAUj?9 zaLw}JR)OTT;LFzfd4G?5<3*AWcXy5#?+#Nkia)rvyz@RP1`IKH$tM)qMQ;>`xLpgF zMg?~*zQ|g>%#y!zs*|MRVmR+*YpEc6Dw}jPdVSRr}zYbN!moW};-p4mS7 zC}4oVon0RHdGpf29`oZn3Af+?QGq^$QR;>s5MP3<6Gy4BNQtaOWVNS1MY#UPY3w> zs&;M#8jW*!^j;=I!x%07lutVmB@ zJx+v(@F&6~h?507t2HtMQiny%hah9JQ{nKc49~q|EmKRfr7$KJNv5vJB+(#XQS#kh zWd(2`x)O4&cR;D$a50{Di|L!`4$eJrMZThfvw6K77>)Tl|1u-h6j(8-SeV)r<&Od* ziu)%M;P=Syt&xF-1eMb8)Is*jpp5l|TCR@^P!`jbRBh8?Q-gx2kCa+@-3x2vD;yM` zbm37J0lo(xDY#EsfuoO?qv610MVGSJ5#g>2{-L{%VpqN5arK=ir-F*rYe};1nKFH! zTfVy;&Ihn^^qAj&Pr6_z*R*Yck3cI8=`vlPt)R8?H5BO%y!%|Zr|M} z1G~MeH_Wl64r?mwi`i!^?=EIUyvu2RU~&Q@8dx5=$S$?6zoPkSpNeHpk8N zBlzfDM3|_ejyY$Zz7XvfzD-=3fYwjzcMs%;m%Yk$gN_8bazDwKU&nT>(4|H_`b^-HYW9in|rh1hkrWB0`e6aAIaDG+#y3hJp3g?dD=% z)ukui;Ts;6us+$XAhO6UDL}=?RWT_AqJfRpWaN9MD$ZOc!Aj9%PfHnUV)fA0a)>Co z&ntWlG%b}pxQB8j!p1mp=k-_e>i271N3m_M};6r_Q&1If`tCqyZCe)3G) z8MloKG}?}_AsnONCl3i@2j;hb4{+Mkyy?@mMhk7~H$7UrV9gVk*pdw*fmgrbU+bg+ zetZXpNCr3PbDJz4S*CCO9K-o-m`Db#8H+bcU#sxcHeZ@EoA3X0;T*##7Oe4Iz2aqA zQ3K7Vlrj>7o3+%Xj=UZiwqKz9C9CbWmYtJ+XGQ-CE#f#rZwwO4%oLz z_n@6tQM4gY(@HpTW2(_4er|`pFPu(i^1Qs0fKlPddN#{foRgHKZJq#kua&r<7#?f5EfFk+{nMNa9qD z5l$Rgs*hgY0Tfh>AF_}q<2Z7Lg;FAU&ijmnHwiqxh?XDqaD3}F6RKK~oMb9dNv@pA z#Q<_0ugqGKzj&mK`8@pnD)L&uEOTb`+)d5aI|pU;mWpRt^E&NCZ{y`MOex`v4% zipTm+KAwh#Q0W<|TiZ#)TIaNIyfL2#8abwaDU}mgDgp`wBL{W(uM@W#33~d~T_Rtn zHu#5%yD4)^`z}@xD$}~=wP8()DqbIflkI2bB+vWXJoUh~O;I0=GTGl7%TJ`=QXCRT z;g|esYIKWNOhHKA+((2T*x6j@L>clXqIYtrbryMdqa2+lr_lhX1Sq#_&Ie-goX%J{wf0(sWqdGc+2;7Ko&c8R zK%!pPs?uNLKAiiGRY}$?u;N-%-YfZK@ z++WA^&Q0A{#tZH5^NOVGJRgSCoYJx7bSS|z8Wj%kYeY}G6#z*mr<=kNTaKdJ+LM83 z-Dg0FF=&VF-n4S`^$}j=hDUS)Zeqi_B6wh??x*G$v#_xlx`SjsXk+~KY`T!-1gVaO zF-M;7C}qJaAEQ0yvsF$SJc639HZ;L-(rUl%z1r#6xO?532N?*-l?06$-H((un#fZS%@-AgBmHfaEIqCbp1Xd0a>GpRfyX)x;ATx zj!tG%kj2bYt17wMo5kt6iaE51oRBWua{erR=68Ty?Ld*kWM(hZ9#>isu{b|}J>z|d z>8%ARer$g1spo6$Q(A(L!^taBAE$vY3{vA%B$CQ7rQW68GR>iIA&#Ito4YNW` zp|ir{LvZ~#waMXRD34NjM1*#Nu^81W7vX$uu*Cr}OFxVM;RsDp{qhb0k8lbQsHi$- zVk3%!L=pNW`Y_D8_W0lVPFJb)wp{9k^YY+em7Lj)e&}=@yikwRvD+s#TVA=JElA5q z=<#FaSk0GvPJVWg4|ihxhPJLpWl76Oyb@F9Bz$~b+eqeTd|u^OyGGB@B?gM0MeQAx z+Hyw63gV7Ouj0prSYIBs1*1?@fO(9=n=d5waheH*#R7N*J8IVAR3bMF19{^~`())} zU;|P_C*s z@rFKALQ)W?d$d8cYfVrWk^RRKkqK|p!QQ5sOJtXXn>S2f!Mj5`Bd1tcfFWyhn~=hA z&63aVL{8IwOksWFg$X#Cv$X2vk8eC9`1SnL z1E>0#QjyQzzdP=UfCsD7OBZ7Ej1M!YRw@PaEm#XU88u~n(#QEmdULrzMlWx%9vV)+ z%J7c2nH#Xs$#F(^c(bq+N5njnG&dNEcFHQRo_2dCl2K?H%~rBes1JY*xNaF0_c&$x zpxWb5mb#g-i2AUp<6t#HE8oUZk9a+dQ>{hD@tmh#M!@r>ac!$)dPBM@FN(gBA+qA< zx5hd=lSkA{v_Ba4p0U-dBS)XJt+u9$Z3YB_#~R(C8hN3lL5LZ2zEU84?(@z-UKJtQ z@5b$CxjSPIvVQzptp;@TbUZry;|+u(yF$8&Lu;AQF-~QWH(~axd*i_oFT_Zm`}P{X zN~*gmLXCw_dR%NuiiBRK%s_D?wf3&E)d~H?C%VVihQ@@6gbP4f~Jr2d|W+Z zN+&ub-}`bRNMf1$8Dp-yyp9?tw~zb@rLxd0tgWJ|c_sXnq1|X+w%KET#%406<1MQO zuME~cj_M&3j5jh*5&2x93fvrl|r)7M>*J?!JKM5Fndc+ zQ8GRL63BbY8gW+YiHdvG~P_^tXWw>xQu==6g2!Vr*?VpjuNJ&Zu?uxAiFQH`|| zD3}02VygLlrbFIq=z_THopQSknbakyDusj*sMuGu$$npY>0AofmGyHp6UBsSzmQKD zM|B7*n|D2?qvoY}?5CULONgb2H7$uvxpOm;DL&P?Bj@o1v*@+!Y(y^-GVkhLXj0tH z^nQj}9rXlgTl39@=}UXeC)MspPU2sqvU$~dqaRO{hYft)k7O>qK|gVdc9<+=k2M84 zPChj$OeY*h#xy}Xx=SdU*^nJw9LCBJ3eDM1XIs6FPT^7LE+{G0%UZxShgb^HMH0Oh zPU57dF_PeaEOS@Q!G?Bw$X+Tz_eAmG@91rsG`SbRCPLPiz@zgc`@nA$18NaywzzE& z1uJ6&Q5GXU;xvV>eS}&yhk3>Kve7SkS}-(F&T9?vI!uq$(S9UP?ySJ6P2^;Y)9Nati} zvuA*Uea2@CXZ3BnKcwp_%C0rIi;^=cWnE6tT+4jeAN!=Es+jpnsUQ}Vog+>#xagyi z0C$pY zjF{hh-B$NVRP?+1c&V{W>2d6B&)YR?PAYvs$bubwFpBNHQ`}zYKJ~7&+6oakB4xbW z{l=y*Jm2a#J#B~S#_32Qx3vHE`H`Ga&3CRPmoyJ7S*As@L#mF~ejnkYkqVlXgM;^Q zNE)m;Yf#3OFDIi_-4^Ahpz5+7TQ66#V&Q~_kjL&dtO&+ zmz^y;rA~(iQuRJmK7*NSTZ{#Tkhy$HC98>__%6M@yRfsMOt=L8knR6nv^-bN?+zY` z2(RWeSA9dnug2)&Vc9-|6ohf^u#JWz$T?I+pO1ABUzOG=8I(tbtki5WFC5-ci`K|2 zH!Qs`uy6d8ojh(LCpNTcv19jxw5|HH7(iJjE(`qNu?*y2s%$L_*JiiIynsFv>5eo=jSf zh}BWr`(o_Ha}jXu1AS1C2|1^R?X}asMT+g9owDq>8|2(?m~X|Vm=zadt3L5hph6#+ zbM)lWBN>r#7$=T^UU zzfF+tBJ{`fgpH@`Fb=YUXb?n%3#6^Iw~B~)M^hj@_ZMTCdZId^iP4bUVf*1(Pp^m^ zHD0NVw{CUp@5u<$mbzArfM35B@7i+e$8Ob&t=!^SD}f-D+V++ztWy=6cetOleR7iP zd%vsYVi4;KvM23K7*Z1gU}^hf3(ycgnzlG~|8V-aEfvyMKHv1vNyf~)1b<=j*A!^# zxNTGbP7&43hWJjJ7(?2k{K|k&C`3mNr)#R^9MKr(?LvjzS$oWf~$O zeD{q@oGCRpMia_+!&pt+TF3+En%-%2np&!70FI@f0cp(iXW23ihOxXSO;s3=CXElW z>3Nc4cw-OvJ+XnS*> zI`uvzT^Tfuj?lBbC4GoZvFVC{I@3M%Ai%ykI{F#*%z*let%_t=<&0IvzcO) z>nB0r=F^LB6!V!`X}^!D>N(H+jH$*PI1N#h1@bcWm{KTkqGLEt+pR8`1TRk-+4X0O zk|5?FOcl#oeY>|GR(!M1ts8D$^0 z+Oi~GIXg;H*qyap-r_Wkq1S^15adYh6cNX?moAp9{R@hn$Wv$I; zXc_nxU~=|_*3T?;R}X(nEqtA)Qz%yP zc!xwmCOH34Suxa*C|vSdvMQT;5y8;8k7(2V2=+X00rDXPD!C`G8E-$>0)N(7ZxnoM z&sq|QeBg&)Mft*S%{%jpD6l1ZvAPJH46I1rygj4h|0O|P+ALP@5TuU<6_F?#TZGfJ zUT(Kt4q?SFb%fQFOAQh`IFvbb?R45SBW%#mZOkn0#>o#vH(4c@|K2id5_IidmG+cc z*-iT(`FN>%!13bv=-qMU%Dc<6a9s~#eB4VwXA=9JazLYcmPBACw-JBm4DY~NLWww8ky663J^pE2%KTaUse+tW!y&#A zFi|OD5lY(8n*(}MC7(b(s+(Faiq)6-oPjeDTA(wCV(|!-y0gahrZ^!&Uvb|5(DJGL zf&06QpOf!o@epve=yS}vuN2>x1H+0kokrVeU!@g$yui_ZH|e0$*?L8}t9KJGz$8Q* zY@zzE!dhYmN=;uEym@l?k>PXp#plcQ&lhKjFx^pI zWXz01?ibqX167?D_o)(i!=(b+tMHqh@5j&jIn0AAnl|NYi`SYdmX0HYpcX3XPE;bs zteF%vDNpr-vK)IidnvfGRp@g~^M^CA5BI}YfMdnWHIDhSbp?-yBzUtT$&xUBpmnA@ zqEp9THtHpkz1^v7vrM#kcdCtpW>(gyWR5L);iZpjVHi(TvVlxwkr>ZllFx|ifaJ(% z|NYEua8~2-j|W*n%f$r+1-}y<9?iVQGU;sljW65aQ-kH^iF4;L(J42Xp6nj~nsTZ% zev>Lj?wRIZKeJg|Fg_k0UeM$%0&qZUIN`7v@?7o_YZ!gI*Hl%#m5XZd}9w>={&*tCz405&RdUx-nN|oq0ukegZWv%0j z&pK1<-l)3J-bY2j;%f4Qb9MdX5lX)-uf7754kSB20`R`xRFhDO4&WHa0`)uheC>Lw zIw|{oJ+rJtiMAN+FLhUSZE>PIz6&Ig*as;q&2xe+TxzRf-%jTyU&ik@7sYTN;_5be zwqUyN3JY1ROB@}k0&*tb$}qH&`6)WosuJ~4r!@|H`9=%q6qkZ68L@=`UV=VG?h1kuf ztt^OtlHltB^!w(gfYh`SF3#qc#gk=9w&H%1+9Ay*KXOnJK585EeLf+FdBjpbmmlm+ l={EM=w=(l+oxCLAD$J2nJ^ILh^`ah6OI=T`T*WT*zW|dj%H99~ delta 5363 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 delta 5379 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 diff --git a/packages/pinball_theme/assets/images/sparky/ball.png b/packages/pinball_theme/assets/images/sparky/ball.png index 95e5a10b6a81f879289a985640f155ee97a4ecc0..fe3f4e8223fa5f2535ab2213ab4c100c410a5409 100644 GIT binary patch delta 8239 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 delta 5266 zcma)AXE+;N`%fYw2ttjb_6kKqh**`_LQz_?M(i4;_9(Ge?NDm8M$uC1F-xs@N|ipw zW3+auqPE)e^?v(b|4;9SbIx_$*SYR}|9;mwvwC&Xd{X9BO#4^Aca;XltQk8U|{l-|fxEUlGyK56VRO7K?`m1hu2t*AZuw*T?!SRz2O z`eJe97dxlgc81Ve3JQ3hb(Csuy!30JH*R*4p+e}UnY^fprqArM>ak+dt= zemEWy&a`8~9p!R|&n&MB2VsCaU39sbTwM&PyyZUY^Sq-{va58vYemoO_}lcCl4;GP zfD{jvE02?Ra_){V2{O*a#H^@!)dAC+9P<=zJ0N5wRG^t_%nL`yDUOP+m8T+$%am5gLbLB4_A3g zWRHB_7qn2}>>)~u5P@d88Of;JAOyRnKsxVWbOs-}m%1UFTeHQV39p0I$$#V?b>G&v z%Mh@|W)!-rvSrzR)Rq0~b%v$9eV1o@g|_tp(~)097ne|Wip@?j@#1sAL9k&x{K5z@ zQr%@4#2mJXgccP#aRYz^RxE;-0@_K>f-cGg^TF_^X#`p^_r-7NBDIg$a>RXLSz64{ zvtC!ftzWd&Dj$#YL08ifHzdP{WG(hu-#sPehwL_f*0-i6--6@Q(U;QhIBJH>X#jyY zlOh^0vMsiz1|i;yKjc6E%?D1t!8-=1PXzF#U5Z7HFYT;r@m@THe{lwWT+X#D-#$4Y zRXOt&4aR-*K@=1ax5 zyRuL0jvVF4>}{|yukQE!(11d+u)}b828X`x$L3F=(!mlWgT*u7*NJnwSZahQ<9q#* z({I^~W2s{B!!;X~k>ed%o`Upmg$JP5{tLSo(@n2Dkmt1{8Pim>x12Xah4SkL1WFoM z#8FUHI--X!7Ka%B{apJK_4CW5ReW%@cx!6;mLso>H3R}h*|Pc<)~-twnj{QLHmdB9 z-wk>+cl!KnNFI6&B>veJj?IT%%oTmN<$vvnAx;YJ8BcbJ=d(mu6li@y;mv%7P8nw1 z+T5grMTCOq>!`#Ja>?TQd@6o)2;fU|8iq#~M7yKekS0rK$g#aA=dWeZ*=Z5!a%+UC zXG`ZsjMXHW;~NDT#Vg45{!^`>-zMzt1)JK@x`Bbwd4bs!FD%;pbLO4DQ~pTysR{`; z%AUO3o>K@~MnNt~?dJKNJ;65ZqBX9;OidbumZd5FassK5$3}5<6||P+^17ozF#Ru4 z;!~pgU`|#X%Afsm^&?OzYz7r&IO}({5&*j^u;6yY_D}u2z4Q}26jV3`uhqIU;i_je zs%>=;o(9?kCY5GiuIDzqqE4I)bd`pV|Mp}pw@tNja%cM=G&iVvw>dy^k3lakAWBV&$ zA<{?Wz6VtN!KcQWPVs<~e?hNqp{x19rh`?{7~fGUXYdPLSA7Yi*|t4@IQJUkmkEk8 zV6X`9hi1zPu8_1>aQatVappN>T7M^`@`^FOU*u}J>s#!jP?f+d&Nvr%MW@FZF;Q=b zD$R)S*I;_UTY6f#XX*|Pr{NwQVUq^f{j#&mztc2~gu#Pik-3x(^^$w$vCFN2{iQ34 zrbEtQE^ro@smz4F^m|uB^t3*D(@&tVF08IWgRLs4q0~3?ZHwK*?_*C{upZ3( znkEec+lNvXToq%Drl-m`upuIEQH=Q5!kLIPY>5!i_R6NcxMis!+%tGHT%t7CPtgz> zb680sAGiNA~u~E=@M`m4*9?q6G8^pC)UCe4;OpVaG^ao|FPEc?W4wh zLH9R|>$%Z8>lRCyfKsrLn2ZI}m{(1QLu&n2ieFcL`bAk0QP3X#(Mv3fZNt|$(K&0_ z`jRg4R0_fJ1PRSeBocK@#aiggUY|07s^l*kL<)QXhM?j`C_J$+jQML5*cohHh|LKa zNv;uPK~v75?a2MZx-|5ZCD;$2>zvyt$>Pyf8U>Uw_pTWL!h#OLj#8i$Q%x$U6xuJ( z1m*FBlE(KA-wtlE%P_v@j-s)|DAgyrs`0KEVpxGiPX0vKnVB}xoons81(r!Z*9ei% z*n-v=AT9jEnsZXXm<04(W;`BOOV2!m8G<`uitL9p|hDbtTw zN7$$&YU&nm-u}r&GbsfGXk@qB8ZX?wGsrriMnRFHVe93w8x4k{x;Lb!JQymIg~^TP z4Zn!g#I=X~@nOH6U0C$oaM`U-Y}ZO;D<9k(Z!Z244_z>2;D4kD6jIjijGZ{YfQQlD zrtKSc(LvHMTR~hMfC%K1>iRJ&zqOBQ1H6Nu6`6zLil&Aq%mN?APw=PwLut#5Jcb?5 zTp;%p38{}@t{98trA)Z?awkE~SA6qLzdn(TD3|QL{*9w~B=^b_F{19jCw4q8GHm?} zUfiDKWElzXk`{&h(OX%T2J`toGq!d86m`rg+kKGaEd`Z=zqWQIP%=1f za|arnLqA16U;Hr1M?B2K(ouy+!YsmR8iw>Am{SN{Hun7z9jB|*ZJnCL6Ilpm_G=8aqtd^Yb*Cr8!unPh>}{jEKt=ihB-Xrhr;}K%J=GR`hlY9wcW&qhUpHn zw^iYzpM_wTpx`u_(K(VXA9vU>!96bo_F?p9zC?DUBLqh$SK(lhZsW9GQfroh$Mys8 z4ZKmT4z(2?S|RKNA9~$-s@>rt^c2py^(N(;2RAu?BG}|xP#_@+Llgu1dtASlRrDC8 zc#nU~_gHBRAGM4Kyh9Z(Mr=?@C?2q72Zz0NMnBOqILR@Gr3IuEX69+m71hE*J3B@Z zRf3GZUleY?#8MTh^M)HD5T!-$5pZv5<}#eGpa!59+8YaF{)_p$yUEI0G>|t9M**1d z(DMThnUYKUBS(H}3g=0+t5>ySgI>rMIZJJlo87rcF~v5+Gr3 zFyUTA=W#oJsj0I_fdr-69*mO8u=fM83f3FZ+ zm?>BrBmQaZ4J~miDV#(8Iz>*ua8*n>55e{LLMQ!|d3;;n2rxyU9CVGw)A11_I9&rh z|65~&T3I(KX~Jt^P!!KJ^RdnLyLSe2gI96h&H??U3HbWYr062h3OLhMN0(BY5?u5u z+U(RwEHI)8*pD*P%18oTbKjn^XZS;fJ5z3n8E1mTlkGQQ(k|G*fm+z6q*b2XfEUn- zfcFHbhdji`hQk2xosAsWr2gF&QLlXp6_J@RAITN|?PHf~o!WUCMGRpahFp)Z)viwQie^Oa432 z64LE;pR@5(ZaiuCO^j*;92?&fJQ@r8EvllJS{p<&S`+2m2O#fTlU&vTaW0*CcjzM= zA;ort2D*~P%^YN|ZP2!xiZ}m*=5y`^VjEE^y&xV$GhdI1;19=dP08*>fUP9W^@qaL8dPWt6Wo$wyL)KF)oF_H9t+VlFo4l% z6D3Uv`xW|t6O{bIx+X1t@v%qvqV3<(&};0|_0wqU%vZx{_c`}1WUg`?o!3!yy^Xc0 zrfpEFk|jANJY9!k>97z({BJtN0BJm|7%UJQlUOXnqI>#tbfcT+6)O_ZP^s1Nm|^1- zEITvv(~IR#7W|-0590QcnTT$1r7BYG70j`s??xbVoOeL&TlMT7$9BWtT27c;f#2I)AAXNs7_t+Ti zrYT7WE=`@XTE$-X{tqDMjHK3xh2%Rue~vW@PS4snx9;EjY^P5>pwIR*Q*HfD|J5Y? zt{N0$^-roU`b*5qS8~`S2Ve=2_fO(L!svx4XJ8tQd~lkq=vVoSNJ#Bx*FIJyWp?4o z!f8!d5^T9^lh97g>XFvL&=l$>hL4VzSKQH8au_})56qu^9@OmOd~wVA;Kx$^Xbmy9 z7S^I1ZAB9PLRnVzKH9|8m~FWf1lfbVz;&C87_Q}hf2%^b?t~Ej0y%VVMk*LVhElX@ zA17#P8YQgy1yj8CCu%`_=Dyg!erDG@4Ry0$nCCj$`I%09IV84r^@2l^rj)RuC{p61 z&tYy=wr-Uqr3ZToV>4%RF>}&teQY=|7SZDX4&FjjeOPqKa1Z~T=$s)|HYOXyqtiTK zD_TVUHFGA}zGmjAX0dR@6NK4stUvM&SiGy6BM?J1VxeBL*7Mb=>%Ec4KsvCZ5t4ET zY*s-nqfAXy8P-hk0reGoc_e03Rx*|5&q)-m3sF-b9!Gqfw`o9@*F-)6@)WOwc^ zdtPnlsazgtj9<)_KkZ!_o($-WQWUt-d#i8x;MVvXvI@YEaD!Y)sFE1jZ_t1=41CD} zH)(Vy!=MA<9N!UhjS6D7s!TKTxmU3PY*dS*sdtI}A|HR34EPvW2mheca$Of$c?{@W z$`abUbc3jT+AN}oo<3E|N?g(bRe9HW?iZ6VxboM-Z{PL_VCrd&Y9?1hqJ@X>YUMcl zcVa)(P8+}bZ+;u_Z$B6&UG!cy80?;3C~AHizvHjs>HJ5|@QGHs{;5vGzigJn4x8z# ztC8tMF;J~bNT%?7cPm}XT({P`DdaxJ!tzn&Kj+_HHS>hIEQPd2oVAvQZC*d3H4tOT zXGi^-qVvHFKhO!fqPw<={mQx%1d+1@1Bm))5+Hs{J-agDEO^$?m-itx1G!Sq^tNtI z>rSjdr?M4fK~x*_#IyA;Y&B71&1xCcrfg5#h5gVkuCCix&=e7BoIBc87wY1a5faGb zYoLj{r(Lr*@baWrHhcb=yBaZXCQLYmdux7W(W*wW-32++k?XU%w}0=&eP_h^;X~c#YlWEWNfmi8k)Omn~)%$y!@VAu=x^_GOaR$%$P;nJ*!>)>j*<+ zeVU(CZEs%2$g({M{%AVdo)9Kt$HZm$L&RCCl5Q7U%IDeoXX|%O$H|gk@9_s9B)nUx zuWB-@Ih%Gvt@_>-x$!aDKI6@xz4xfRjfP9}*cqLn=9v~bjtw#H(yvuPxBHHYzNyo1 zpn#Us!~DtlN9T3*^Ho4!$kj8iXTIS?8@Ifl_w-|5<$X0|Wm{QnWlONz^*t7S_~7>Q ziYyPCaf??U+nR(s_lAoOQ&mnIKb6Bcnw>9f0DuL$J752OK2#r&<-K9x@!Z;u-Jzzt zKiUzVcfS@B0VsT<3XiVfFAbid9i#BDnGJcycl>>G-nzPPZ3*>wh}z3@`okx|GwmbC zO)kqp+yF0S)D7D3G@~k63-9I2KFh|}N@K8fH-q)et1=Jcg%vf$S+2D!xy>M|b7Gu3 X_2SaRE5_?@Mu3inzIwH)ZRCFd{^p5u diff --git a/test/game/components/android_acres/behaviors/ball_spawning_behavior_test.dart b/test/game/behaviors/ball_spawning_behavior_test.dart similarity index 90% rename from test/game/components/android_acres/behaviors/ball_spawning_behavior_test.dart rename to test/game/behaviors/ball_spawning_behavior_test.dart index f41487cd..d723c65e 100644 --- a/test/game/components/android_acres/behaviors/ball_spawning_behavior_test.dart +++ b/test/game/behaviors/ball_spawning_behavior_test.dart @@ -6,6 +6,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball/game/behaviors/ball_spawning_behavior.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_theme/pinball_theme.dart' as theme; @@ -18,18 +19,20 @@ class _TestGame extends Forge2DGame { } Future pump( - Iterable children, { + List children, { GameBloc? gameBloc, }) async { await ensureAdd( - FlameBlocProvider.value( - value: gameBloc ?? GameBloc(), - children: [ - FlameProvider.value( - const theme.DashTheme(), - children: children, + FlameMultiBlocProvider( + providers: [ + FlameBlocProvider.value( + value: gameBloc ?? GameBloc(), + ), + FlameBlocProvider.value( + value: CharacterThemeCubit(), ), ], + children: children, ), ); } diff --git a/test/game/behaviors/ball_theming_behavior_test.dart b/test/game/behaviors/ball_theming_behavior_test.dart new file mode 100644 index 00000000..0c1e0b36 --- /dev/null +++ b/test/game/behaviors/ball_theming_behavior_test.dart @@ -0,0 +1,93 @@ +// ignore_for_file: cascade_invocations + +import 'package:bloc_test/bloc_test.dart'; +import 'package:flame/components.dart'; +import 'package:flame_bloc/flame_bloc.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:pinball/game/behaviors/behaviors.dart'; +import 'package:pinball/select_character/select_character.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; +import 'package:pinball_theme/pinball_theme.dart' as theme; + +class _TestGame extends Forge2DGame { + @override + Future onLoad() async { + images.prefix = ''; + await images.loadAll([ + theme.Assets.images.dash.ball.keyName, + theme.Assets.images.dino.ball.keyName, + ]); + } + + Future pump( + List children, { + CharacterThemeCubit? characterThemeBloc, + }) async { + await ensureAdd( + FlameBlocProvider.value( + value: characterThemeBloc ?? CharacterThemeCubit(), + children: children, + ), + ); + } +} + +class _MockBallCubit extends Mock implements BallCubit {} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group( + 'BallThemingBehavior', + () { + final flameTester = FlameTester(_TestGame.new); + + test('can be instantiated', () { + expect( + BallThemingBehavior(), + isA(), + ); + }); + + flameTester.test( + 'loads', + (game) async { + final behavior = BallThemingBehavior(); + await game.pump([behavior]); + expect(game.descendants(), contains(behavior)); + }, + ); + + flameTester.test( + 'onNewState calls onThemeChanged on the ball bloc', + (game) async { + final ballBloc = _MockBallCubit(); + whenListen( + ballBloc, + const Stream.empty(), + initialState: const BallState.initial(), + ); + final ball = Ball.test(bloc: ballBloc); + final behavior = BallThemingBehavior(); + await game.pump([ + ball, + behavior, + ZCanvasComponent(), + Plunger.test(compressionDistance: 10), + ]); + + const dinoThemeState = CharacterThemeState(theme.DinoTheme()); + behavior.onNewState(dinoThemeState); + await game.ready(); + + verify(() => ballBloc.onThemeChanged(dinoThemeState.characterTheme)) + .called(1); + }, + ); + }, + ); +} diff --git a/test/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior_test.dart b/test/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior_test.dart index 3dcd870b..0d058c70 100644 --- a/test/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior_test.dart +++ b/test/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior_test.dart @@ -7,6 +7,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball/game/components/flutter_forest/behaviors/behaviors.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_theme/pinball_theme.dart' as theme; @@ -26,16 +27,16 @@ class _TestGame extends Forge2DGame { required GameBloc gameBloc, }) async { await ensureAdd( - FlameBlocProvider.value( - value: gameBloc, + FlameMultiBlocProvider( + providers: [ + FlameBlocProvider.value(value: gameBloc), + FlameBlocProvider.value( + value: CharacterThemeCubit(), + ), + ], children: [ - FlameProvider.value( - const theme.DashTheme(), - children: [ - ZCanvasComponent( - children: [child], - ), - ], + ZCanvasComponent( + children: [child], ), ], ), diff --git a/test/game/components/game_bloc_status_listener_test.dart b/test/game/components/game_bloc_status_listener_test.dart index 7118aa8d..767ddefa 100644 --- a/test/game/components/game_bloc_status_listener_test.dart +++ b/test/game/components/game_bloc_status_listener_test.dart @@ -8,10 +8,10 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:leaderboard_repository/leaderboard_repository.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; -import 'package:pinball_theme/pinball_theme.dart' as theme; class _TestGame extends Forge2DGame { @override @@ -25,18 +25,18 @@ class _TestGame extends Forge2DGame { PinballPlayer? pinballPlayer, }) async { return ensureAdd( - FlameBlocProvider.value( - value: GameBloc(), + FlameMultiBlocProvider( + providers: [ + FlameBlocProvider.value( + value: GameBloc(), + ), + FlameBlocProvider.value( + value: CharacterThemeCubit(), + ), + ], children: [ - MultiFlameProvider( - providers: [ - FlameProvider.value( - pinballPlayer ?? _MockPinballPlayer(), - ), - FlameProvider.value( - const theme.DashTheme(), - ), - ], + FlameProvider.value( + pinballPlayer ?? _MockPinballPlayer(), children: children, ), ], diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 4130ca77..3b034c8f 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -13,14 +13,14 @@ import 'package:leaderboard_repository/src/leaderboard_repository.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball/game/behaviors/behaviors.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_audio/src/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_theme/pinball_theme.dart' as theme; class _TestPinballGame extends PinballGame { _TestPinballGame() : super( - characterTheme: const theme.DashTheme(), + characterThemeBloc: CharacterThemeCubit(), leaderboardRepository: _MockLeaderboardRepository(), gameBloc: GameBloc(), l10n: _MockAppLocalizations(), @@ -39,7 +39,7 @@ class _TestPinballGame extends PinballGame { class _TestDebugPinballGame extends DebugPinballGame { _TestDebugPinballGame() : super( - characterTheme: const theme.DashTheme(), + characterThemeBloc: CharacterThemeCubit(), leaderboardRepository: _MockLeaderboardRepository(), gameBloc: GameBloc(), l10n: _MockAppLocalizations(), @@ -109,6 +109,17 @@ void main() { }, ); + flameTester.test( + 'has only one BallThemingBehavior', + (game) async { + await game.ready(); + expect( + game.descendants().whereType().length, + equals(1), + ); + }, + ); + flameTester.test( 'has only one Drain', (game) async { diff --git a/test/game/view/pinball_game_page_test.dart b/test/game/view/pinball_game_page_test.dart index a0ed4c7e..0e23e54d 100644 --- a/test/game/view/pinball_game_page_test.dart +++ b/test/game/view/pinball_game_page_test.dart @@ -16,14 +16,13 @@ import 'package:pinball/more_information/more_information.dart'; import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/start_game/start_game.dart'; import 'package:pinball_audio/pinball_audio.dart'; -import 'package:pinball_theme/pinball_theme.dart' as theme; import '../../helpers/helpers.dart'; class _TestPinballGame extends PinballGame { _TestPinballGame() : super( - characterTheme: const theme.DashTheme(), + characterThemeBloc: CharacterThemeCubit(), leaderboardRepository: _MockLeaderboardRepository(), gameBloc: GameBloc(), l10n: _MockAppLocalizations(),