From cbbf7b121e5fcb6bef8c44d84944afc94a6358f6 Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Fri, 1 Apr 2022 12:55:17 +0100 Subject: [PATCH 1/7] fix: flaky FireEffect test (#124) * refactor: migrated to ParticleSystemComponent * refactor: simplified tests * feat: forced min count to be 1 * feat: adjusted priorities --- .../lib/src/components/ball.dart | 5 +- .../lib/src/components/fire_effect.dart | 57 ++++++------------- .../lib/stories/effects/fire_effect.dart | 1 - .../test/helpers/mocks.dart | 4 -- .../test/src/components/fire_effect_test.dart | 48 +++------------- 5 files changed, 28 insertions(+), 87 deletions(-) diff --git a/packages/pinball_components/lib/src/components/ball.dart b/packages/pinball_components/lib/src/components/ball.dart index b62ceeba..892936f9 100644 --- a/packages/pinball_components/lib/src/components/ball.dart +++ b/packages/pinball_components/lib/src/components/ball.dart @@ -83,8 +83,9 @@ class Ball extends BodyComponent final direction = body.linearVelocity.normalized(); final effect = FireEffect( burstPower: _boostTimer, - direction: direction, - position: body.position, + direction: -direction, + position: Vector2(body.position.x, -body.position.y), + priority: priority - 1, ); unawaited(gameRef.add(effect)); diff --git a/packages/pinball_components/lib/src/components/fire_effect.dart b/packages/pinball_components/lib/src/components/fire_effect.dart index 0a7cef2b..cf8c3707 100644 --- a/packages/pinball_components/lib/src/components/fire_effect.dart +++ b/packages/pinball_components/lib/src/components/fire_effect.dart @@ -1,5 +1,6 @@ import 'dart:math' as math; +import 'package:flame/components.dart'; import 'package:flame/extensions.dart'; import 'package:flame/particles.dart'; import 'package:flame_forge2d/flame_forge2d.dart' hide Particle; @@ -19,33 +20,24 @@ const _particleRadius = 0.25; /// A [BodyComponent] which creates a fire trail effect using the given /// parameters /// {@endtemplate} -class FireEffect extends BodyComponent { +class FireEffect extends ParticleSystemComponent { /// {@macro fire_effect} FireEffect({ required this.burstPower, - required this.position, required this.direction, - }); + Vector2? position, + int? priority, + }) : super( + position: position, + priority: priority, + ); /// A [double] value that will define how "strong" the burst of particles - /// will be + /// will be. final double burstPower; - /// The position of the burst - final Vector2 position; - - /// Which direction the burst will aim + /// Which direction the burst will aim. final Vector2 direction; - late Particle _particle; - - @override - Body createBody() { - final bodyDef = BodyDef()..position = position; - - final fixtureDef = FixtureDef(CircleShape()..radius = 0)..isSensor = true; - - return world.createBody(bodyDef)..createFixture(fixtureDef); - } @override Future onLoad() async { @@ -71,15 +63,15 @@ class FireEffect extends BodyComponent { ); }), ]; - final rng = math.Random(); + final random = math.Random(); final spreadTween = Tween(begin: -0.2, end: 0.2); - _particle = Particle.generate( - count: (rng.nextDouble() * (burstPower * 10)).toInt(), + particle = Particle.generate( + count: math.max((random.nextDouble() * (burstPower * 10)).toInt(), 1), generator: (_) { final spread = Vector2( - spreadTween.transform(rng.nextDouble()), - spreadTween.transform(rng.nextDouble()), + spreadTween.transform(random.nextDouble()), + spreadTween.transform(random.nextDouble()), ); final finalDirection = Vector2(direction.x, -direction.y) + spread; final speed = finalDirection * (burstPower * 20); @@ -88,26 +80,9 @@ class FireEffect extends BodyComponent { lifespan: 5 / burstPower, position: Vector2.zero(), speed: speed, - child: children[rng.nextInt(children.length)], + child: children[random.nextInt(children.length)], ); }, ); } - - @override - void update(double dt) { - super.update(dt); - _particle.update(dt); - - if (_particle.shouldRemove) { - removeFromParent(); - } - } - - @override - void render(Canvas canvas) { - super.render(canvas); - - _particle.render(canvas); - } } diff --git a/packages/pinball_components/sandbox/lib/stories/effects/fire_effect.dart b/packages/pinball_components/sandbox/lib/stories/effects/fire_effect.dart index 9f066952..1262af11 100644 --- a/packages/pinball_components/sandbox/lib/stories/effects/fire_effect.dart +++ b/packages/pinball_components/sandbox/lib/stories/effects/fire_effect.dart @@ -34,7 +34,6 @@ class _EffectEmitter extends Component { add( FireEffect( burstPower: (_timer / _timerLimit) * _force, - position: Vector2.zero(), direction: _direction, ), ); diff --git a/packages/pinball_components/test/helpers/mocks.dart b/packages/pinball_components/test/helpers/mocks.dart index c36afff2..7771d1e1 100644 --- a/packages/pinball_components/test/helpers/mocks.dart +++ b/packages/pinball_components/test/helpers/mocks.dart @@ -1,12 +1,8 @@ -import 'dart:ui'; - import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball_components/pinball_components.dart'; -class MockCanvas extends Mock implements Canvas {} - class MockFilter extends Mock implements Filter {} class MockFixture extends Mock implements Fixture {} diff --git a/packages/pinball_components/test/src/components/fire_effect_test.dart b/packages/pinball_components/test/src/components/fire_effect_test.dart index 7bc62212..2c404747 100644 --- a/packages/pinball_components/test/src/components/fire_effect_test.dart +++ b/packages/pinball_components/test/src/components/fire_effect_test.dart @@ -1,11 +1,8 @@ // ignore_for_file: cascade_invocations -import 'dart:ui'; - import 'package:flame/components.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:mocktail/mocktail.dart'; import 'package:pinball_components/pinball_components.dart'; import '../../helpers/helpers.dart'; @@ -14,43 +11,16 @@ void main() { TestWidgetsFlutterBinding.ensureInitialized(); final flameTester = FlameTester(TestGame.new); - setUpAll(() { - registerFallbackValue(Offset.zero); - registerFallbackValue(Paint()); - }); - - group('FireEffect', () { - flameTester.test('is removed once its particles are done', (game) async { - await game.ensureAdd( - FireEffect( - burstPower: 1, - position: Vector2.zero(), - direction: Vector2.all(2), - ), - ); - await game.ready(); - expect(game.children.whereType().length, equals(1)); - game.update(5); - - await game.ready(); - expect(game.children.whereType().length, equals(0)); - }); - - flameTester.test('render circles on the canvas', (game) async { - final effect = FireEffect( + flameTester.test( + 'loads correctly', + (game) async { + final fireEffect = FireEffect( burstPower: 1, - position: Vector2.zero(), - direction: Vector2.all(2), + direction: Vector2.zero(), ); - await game.ensureAdd(effect); - await game.ready(); - - final canvas = MockCanvas(); - effect.render(canvas); + await game.ensureAdd(fireEffect); - verify(() => canvas.drawCircle(any(), any(), any())).called( - greaterThan(0), - ); - }); - }); + expect(game.contains(fireEffect), isTrue); + }, + ); } From 40d0fd0995c89428d06adc01ede26bd2465e9b2b Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Fri, 1 Apr 2022 13:04:33 +0100 Subject: [PATCH 2/7] refactor: implemented FlameBlocTester (#122) * refactor: implemented FlameBlocTester * refactor: renamed parameter bloc to blocBuilder --- test/game/components/bonus_word_test.dart | 14 ++++---- .../game/components/controlled_ball_test.dart | 18 +++++----- test/game/components/flutter_forest_test.dart | 18 +++++----- test/helpers/builders.dart | 34 +++++++++---------- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/test/game/components/bonus_word_test.dart b/test/game/components/bonus_word_test.dart index f48d60ee..7d73b6bc 100644 --- a/test/game/components/bonus_word_test.dart +++ b/test/game/components/bonus_word_test.dart @@ -196,10 +196,10 @@ void main() { group('bonus letter activation', () { late GameBloc gameBloc; - final tester = flameBlocTester( + final flameBlocTester = FlameBlocTester( // TODO(alestiago): Use TestGame once BonusLetter has controller. - game: PinballGameTest.create, - gameBloc: () => gameBloc, + gameBuilder: PinballGameTest.create, + blocBuilder: () => gameBloc, ); setUp(() { @@ -211,7 +211,7 @@ void main() { ); }); - tester.testGameWidget( + flameBlocTester.testGameWidget( 'adds BonusLetterActivated to GameBloc when not activated', setUp: (game, tester) async { await game.ready(); @@ -225,7 +225,7 @@ void main() { }, ); - tester.testGameWidget( + flameBlocTester.testGameWidget( "doesn't add BonusLetterActivated to GameBloc when already activated", setUp: (game, tester) async { const state = GameState( @@ -253,7 +253,7 @@ void main() { }, ); - tester.testGameWidget( + flameBlocTester.testGameWidget( 'adds a ColorEffect', setUp: (game, tester) async { const state = GameState( @@ -284,7 +284,7 @@ void main() { }, ); - tester.testGameWidget( + flameBlocTester.testGameWidget( 'only listens when there is a change on the letter status', setUp: (game, tester) async { await game.ready(); diff --git a/test/game/components/controlled_ball_test.dart b/test/game/components/controlled_ball_test.dart index dcd075ca..8417aa25 100644 --- a/test/game/components/controlled_ball_test.dart +++ b/test/game/components/controlled_ball_test.dart @@ -66,12 +66,12 @@ void main() { ); }); - final tester = flameBlocTester( - game: PinballGameTest.create, - gameBloc: () => gameBloc, + final flameBlocTester = FlameBlocTester( + gameBuilder: PinballGameTest.create, + blocBuilder: () => gameBloc, ); - tester.testGameWidget( + flameBlocTester.testGameWidget( 'lost adds BallLost to GameBloc', setUp: (game, tester) async { final controller = LaunchedBallController(ball); @@ -86,7 +86,7 @@ void main() { ); group('listenWhen', () { - tester.testGameWidget( + flameBlocTester.testGameWidget( 'listens when a ball has been lost', setUp: (game, tester) async { final controller = LaunchedBallController(ball); @@ -107,7 +107,7 @@ void main() { }, ); - tester.testGameWidget( + flameBlocTester.testGameWidget( 'does not listen when a ball has not been lost', setUp: (game, tester) async { final controller = LaunchedBallController(ball); @@ -130,7 +130,7 @@ void main() { }); group('onNewState', () { - tester.testGameWidget( + flameBlocTester.testGameWidget( 'removes ball', setUp: (game, tester) async { final controller = LaunchedBallController(ball); @@ -147,7 +147,7 @@ void main() { }, ); - tester.testGameWidget( + flameBlocTester.testGameWidget( 'spawns a new ball when the ball is not the last one', setUp: (game, tester) async { final controller = LaunchedBallController(ball); @@ -168,7 +168,7 @@ void main() { }, ); - tester.testGameWidget( + flameBlocTester.testGameWidget( 'does not spawn a new ball is the last one', setUp: (game, tester) async { final controller = LaunchedBallController(ball); diff --git a/test/game/components/flutter_forest_test.dart b/test/game/components/flutter_forest_test.dart index a0e1b81f..33dbb991 100644 --- a/test/game/components/flutter_forest_test.dart +++ b/test/game/components/flutter_forest_test.dart @@ -86,12 +86,12 @@ void main() { group('controller', () { group('listenWhen', () { final gameBloc = MockGameBloc(); - final tester = flameBlocTester( - game: TestGame.new, - gameBloc: () => gameBloc, + final flameBlocTester = FlameBlocTester( + gameBuilder: TestGame.new, + blocBuilder: () => gameBloc, ); - tester.testGameWidget( + flameBlocTester.testGameWidget( 'listens when a Bonus.dashNest is added', verify: (game, tester) async { final flutterForest = FlutterForest(); @@ -145,12 +145,12 @@ void main() { ); }); - final tester = flameBlocTester( - game: PinballGameTest.create, - gameBloc: () => gameBloc, + final flameBlocTester = FlameBlocTester( + gameBuilder: PinballGameTest.create, + blocBuilder: () => gameBloc, ); - tester.testGameWidget( + flameBlocTester.testGameWidget( 'add DashNestActivated event', setUp: (game, tester) async { await game.ready(); @@ -171,7 +171,7 @@ void main() { }, ); - tester.testGameWidget( + flameBlocTester.testGameWidget( 'add Scored event', setUp: (game, tester) async { final flutterForest = FlutterForest(); diff --git a/test/helpers/builders.dart b/test/helpers/builders.dart index 970dd12b..f78aebe7 100644 --- a/test/helpers/builders.dart +++ b/test/helpers/builders.dart @@ -1,21 +1,21 @@ -import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame/src/game/flame_game.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:pinball/game/game.dart'; -FlameTester flameBlocTester({ - required T Function() game, - required GameBloc Function() gameBloc, -}) { - return FlameTester( - game, - pumpWidget: (gameWidget, tester) async { - await tester.pumpWidget( - BlocProvider.value( - value: gameBloc(), - child: gameWidget, - ), - ); - }, - ); +class FlameBlocTester> + extends FlameTester { + FlameBlocTester({ + required GameCreateFunction gameBuilder, + required B Function() blocBuilder, + }) : super( + gameBuilder, + pumpWidget: (gameWidget, tester) async { + await tester.pumpWidget( + BlocProvider.value( + value: blocBuilder(), + child: gameWidget, + ), + ); + }, + ); } From e6fd5f90fa084ffefd2a3936449b251e68b91a6f Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Fri, 1 Apr 2022 13:07:25 +0100 Subject: [PATCH 3/7] feat: disallowed adding components to `ComponentController` (#121) * feat: disallowed adding components to a ComponentController * docs: rephrased text * refactor: fixed variable typo * feat: included addAll test --- lib/flame/component_controller.dart | 5 ++++ test/flame/component_controller_test.dart | 30 +++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/lib/flame/component_controller.dart b/lib/flame/component_controller.dart index 851028f0..1d6e0173 100644 --- a/lib/flame/component_controller.dart +++ b/lib/flame/component_controller.dart @@ -23,6 +23,11 @@ abstract class ComponentController extends Component { ); await super.addToParent(parent); } + + @override + Future add(Component component) { + throw Exception('ComponentController cannot add other components.'); + } } /// Mixin that attaches a single [ComponentController] to a [Component]. diff --git a/test/flame/component_controller_test.dart b/test/flame/component_controller_test.dart index 4e5da210..e1973274 100644 --- a/test/flame/component_controller_test.dart +++ b/test/flame/component_controller_test.dart @@ -31,6 +31,7 @@ void main() { ); }, ); + flameTester.test( 'throws AssertionError when not attached to controlled component', (game) async { @@ -44,6 +45,35 @@ void main() { ); }, ); + + flameTester.test( + 'throws Exception when adding a component', + (game) async { + final component = ControlledComponent(); + final controller = TestComponentController(component); + + await expectLater( + () async => controller.add(Component()), + throwsException, + ); + }, + ); + + flameTester.test( + 'throws Exception when adding multiple components', + (game) async { + final component = ControlledComponent(); + final controller = TestComponentController(component); + + await expectLater( + () async => controller.addAll([ + Component(), + Component(), + ]), + throwsException, + ); + }, + ); }); group('Controls', () { From c8bc7c194221f0ae300cd676db3d4fcf64281b9a Mon Sep 17 00:00:00 2001 From: Rui Miguel Alonso Date: Fri, 1 Apr 2022 14:36:16 +0200 Subject: [PATCH 4/7] feat: spaceship drop assets (#110) * feat: added assets for drop rail * feat: placed assets and base bodies * feat: assets and bases * refactor: hide spaceship hole * refactor: redimension curves * fix: lint * test: fix geometry tests * refactor: tube to fit spaceship opening * refactor: applied priority changes to drop tube * test: fixed tests for ball contact with exit rail * Update test/game/components/spaceship_exit_rail_test.dart Co-authored-by: Alejandro Santiago * chore: formatted test file Co-authored-by: Allison Ryan Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> Co-authored-by: Alejandro Santiago --- .../images/components/spaceship-drop-tube.png | Bin 0 -> 64940 bytes lib/game/components/spaceship_exit_rail.dart | 243 ++++++++++-------- lib/game/game_assets.dart | 1 + lib/game/pinball_game.dart | 4 +- lib/gen/assets.gen.dart | 4 + packages/geometry/test/src/geometry_test.dart | 4 +- .../lib/src/components/spaceship.dart | 4 +- .../components/spaceship_exit_rail_test.dart | 16 +- 8 files changed, 154 insertions(+), 122 deletions(-) create mode 100644 assets/images/components/spaceship-drop-tube.png diff --git a/assets/images/components/spaceship-drop-tube.png b/assets/images/components/spaceship-drop-tube.png new file mode 100644 index 0000000000000000000000000000000000000000..4b299c2cdf9726054d8e859fe4b6d101765fe63e GIT binary patch literal 64940 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%0A#hiNx}Wz zhwrtNoo$fo+d1qgO_;@REHuBqc~Ud{1Z=59RI<15yS&wOSX@ynsG{vbBreot3)XmX z`2wICb_$9+DJi~x_I{_1Z$X3Tg5R|-N=btk{l`UQL=wLZ{LIK_TmP*Fw4xR0f*{{a z1aZELoo)j{v+gUC3iGO_7e81j29i2yxrM&cS>mTmktF?)cXcMzPZmZ6aO!+jW;U&l z{w7y5V=pDef|8`V-fgh?Y9x;<<85F_J8*1{U;EP?bOcMNbr^vJt~h5`E4%D~v@03( zhz0zrR)*KrSKQ@AMWYD!N-*|_T>4FDH!IB`@cNq79Z;W9u31k*8E_wLl3qgWKo#&@ zS4c8LUqhEo5b62^GZoZGtuTIY?A!oH-M2|bGOEnqT2$6n8Zb5f1WP)rf7jiR$NP~Z zGS6hYd|V$T@m5X)b*U&X{|Q|M{gtPGP=;P=u*!D?=q_w{WMfto7y=21@*s9Fl?iR%bma$l zq_p;_H;?tv58FgUyk-hZ<3uySFKD6g*PJRvTFi~9sg)9sbX zTyJmhlw39M2Gt=S<-x7t>F#)CkXv1URKY2=H8O*MHOk7$fA+=)Kc2_|n?oL^o<l2ja~-Il7TXhIa`E!w(4b$v$(mSt{unBpb+YC`MGThh*fGC`df%1ZrGP0W&9No zU_nfKPW+8|wF zw$f5|vmqMlaaHDzDENHC(^H=OD*{)RU<}>(E7fM^4Au0uJbd-Dur>WQF|nUe6Ydt8 zAwnjDdjfWVbqxIrvBnaU=fv#rc~+Jk6lQS@YX@;z>n;|Z0hqH1LsGf))Hdn+gi!_H zK+zTqxFKnts1cMkFVHg7<93Gz9IRT5b?!R?U`L1avr!{A&gHP#0m72IGElZu@Yy$F z$VZI>U@EAp#65=;00Vh z(FfZ%CN;|R;ts+Q{Bn%zjg0u)PzkelmPS=>+;Hea)#WepCyELSx%oAmE2#}HEjl@J zH^2rv@=cL(OX(TF!!TPtO>BH>K1(qS+{1&%WU&i#pzt9jDi(lL&M1velfKNwBnvR@G@C1MV>|ASNf|tp`BkVe;_`_qUCW` zxbFg}gQYnfELv&2svML&m3d|`8>pXN^wLRD^r*)C~ z8c;@rj|TX2AbvDw(h}R@kG|4$S6tT7BS%7D@1a@tK!Tfb8q|>alWZBW$FERf_5gZN zGRTt+5HoH2Wrh3pbKbMl`0QC7plw{kUSaff?3iWQf~PWM^PLxY=X$!(64a{@8HZ`@ z)`0Og@-10zI55&JO^P1^glhpV4e&x{$uH@pnuGU@SV1n$c#EVr>)=o^Sk&v7}G^-m3@_UD0e!iSOA{ z?%Emr8C+q~^1vWwJI2bc3=PckMzMUf@S(kmUTwffZ$bM5k0(&;yRe?wmN5Xk-aeH0 zxu&JA5K&*jIZ?Cta&AE|0&oR7qAuQMzFBjpBU_arBoy$Go<`>bzCaNKx(fhCg05NI zIKJy4M&)-oI5{)_`L0n5^O8^%`P|Y^C|8W7R_XYBi zdHRg{cktjJ;$~O_6)DeYz3|BH0$}7vwdj+1F%ti#?Joyg&+4o`JYcvYFO~Ng?D9@{)N>E3^YkltA*Qod}idqVI?zb?vHsf%+cyNM2ii;rx z(_mt$Un8e??G)8?OV}F1szi8t7ci^nnp*$2ew#78#n^ld=j1@%>bhAt=d=eCHLMn0ZQta?gon-p-M5?BZYeK3<8F{bvZ#>|aRW)o z5+DLfl7+)xfCrS}x&N+@+$J}0xWNg};pi%{HZs9uq8I&`wpb_0fRr=}3p=P9=8k<& zz_8sJ)k;4pMIN@sA8VLH{JVqTbvq@62ezNRSHA4(#nl9-HVU6o7L+4HNtC-|*A%h| zHxe$q_4KP}WT8F9m*AO5VSp3k}%tl z!QZbzrb^vix&gLnuQM~p*`h}F8j7H8OGj=%J)$5h>pHDn$SlPWH|JSyj{}{Fue?F? zJSsGRors$Uq@}Nca;{w5M_8_i8xJvS5LLNs0^+3S+*ngGQj-bQ^o|!eiBTXLz^~;V z+9RFMDnz)0@(~VieTji;eHr<-MaGRpVFp8L3)M}q*J;1#f(qg{N;$kxDiCw5q_xj` zd3rVjKB-o159H$m?hPC0PK>_BQ#i}u$AQ`N5QaSx2)N%K4HzJeQwAJN)15wx)6ngn z0&C_);MI<>0Vp2*L<3(>RP(*a($N{b#DfsPO%keJFGzN_yGq_*zi_?DHv4{ZvR5HM z^k3B9)>q=&oi;k%eFp!5QP|GmXOGaoD4}qyj|ePA#|rIE2JW*GT9LNMIZPBBN8cxi zk`X!{0^kW}KuY$RFhttpAkZ_O4~GKaUVovHA&L?{AJXSJprAo7vXTRNRL$^im@wg% zuuRnayry6(=>zUmH)@#gKYx}#!8{;VDvLlc$mQh#VPVhe88y;{zwZI$UK!)v9`C71 z&|!kl^&_1S3zrDY^*_LNq6LH?&2(i7g!A1R`iREYI60=P{4XNO^T)k=f&i$j%Iw%0 z2M4Il7`h;KkZqjD8i9DjSqT=&94>qiV8LO7NU+L+N<^pGV6BzF#QZdN536 zEO|#O!h}=eLmmPKY?$rsc*ulcI)(Y!T>v^`-hYQ2l98t_dy1tmWy)eb4}MAzs0N;P0@f;V)r- zG6o}H0SfTV!HAP2cl>nujx^>&{~4wrC7)neuxq&1E-$rA zQvG4;AM~UblsBO;^d*xiNXHQ~Lf5f}r=xs#g(1RQ)CPwi7>hu(gt6`!D8rHP$F2*T zJDDVyK+rffSn2oEqs<7n{g+}(Dmv^~6YI3jk=!Oo1P~@GaNg(ZjAucufCLkqCpuEh8 zSH?}>L*Y-1xZ=!f07z8BmKJo1l+=8os(ay0~qKySn)5h3Lz+gUkI5 zbNmlX17Lw{Cqo)s%;(;^KY#rAgP8CD%KB{$P7E*SZlnp3jtFPAF|Dc%zDmvjDo8cb z==eQ~_F%1rC+$jM=1XGD&%q305L`C;$mFE(}3`L$649LG_zqLinCJ47g zBy1%@`1Y`yp*|mOS7iJNZL-7HXaV-5wP!^B8IfQM5k6R+pr=AaX^f)N0Yv0LxngvT z7MKQ}#1r4Au6N_yI5$RHn?P1KNR`_wgJX~Q3@zkhiL_lnx{xL|G<1^%Ga@gLmap8x z344OV5VD%o+Pa^Dc^g32GzJ|(7PcgrbLA(I>X3lCS$Cf(gYUqGEPhp%8)lisL<9$v z!TmvXa*5Y|SA6;0gVUm(rw_w42Vd?xuI`6|vfYrfBlVa=s1JH*W*|Kw%m50oB_d9BL`SopP4v-h`jI6M77Dl0De9KkcVBZz2*6G-ef0;T6d_-K*qG;w3ckY`R+xB+toS5yrl`Zc_( zKDV`L;3AHI4Sf4{$zuAMl%!u3h~}O+osFd1+S3DQ`Uu8Q6;Rp!6Ps>)A;u4{Q&OP; zfOiyj0haX?`llZSNk0pLEbQ6W8u1s@lTv#?IkROFn8kk}J>lJB0x1{IVTr{7Rvgg)^AGUH~u2YWRpd+&v5fy`pmN3@c&4|(a z`ltjt=o^K@^_iHM%q0phW2=iSl>P7>`^Ap3f`i_b0)8au@pC~*N3$F}ek^DL_0kw} z#=?rYHKH1zFEgJzO|v-f83S@~+$7eCU(;%Xp_c4Jm(_zbcXISPDs@zTA5n#-fL!U{ zZt-P^WfB4IH^RU3gY!3G!2l!6zo!C)E8qV-0k~2-I?+iwZZBn3Me30Iv(c0g8Xo75BpAUZJ8^BBoO&W0R_i>+Q4I+ z8{y?;$D`=(82NZ2kXq#`cLUzRaX-H`@PhTlE9AuPh~2q+*OQO&lm|z#&hN!Va}+bO zS!1FIYy=U+_7m?vJDZAW2a3Cvk@62Bf)cB{^3TgaCJ~flx5+t}KwIENqm&4XUNkp@ zyES5C#q?A$+Oz?NG4Rt>B9M}m6DJG)X-jLVW?bu+_Yq>F0fH|F9h zf$KH-Trh!sA!_j4#6$0O3BGF|RPr;BcOCtX&^h}G#{IM8d*0&6(NfxmfhAD*2>GZ+ zz6z9UC^tQD@sTK=rR6UJX}~vagEXocRI^7B#vp5u)*d2S9!1gpJKLh>mg*Fc(NS#` z0D3yva=;u{_f@s?8}dpY3x#8n5wxua#$QK4$M0mKJOg(wfC{eQsvA?OE_e-KDH9u= z`a5WkpL6s$-D|QX?eA_^S?fT)DhKQ1I1kgC`j)>Kl{;Y01HF%S^%xnsbrZ6&=W7Jf>5qtJK?0A!e!egsD(TgLO zjR0*O%!6t0FWaa)AJI37p)8a-_rIvcoelV7a?8cVRF+BEOW7>pg0Zg)tl3 z5wO1#9>G_S1A7P>f~x%mVvGy8#{1gt(zGrok`alkB$wioq~o*@9}zx8=BI9d%QfkB zEUL_CKt?ehPdJniisy}^#f~i2j}pyM>Q55ewgybD=9UW1k;;b{7G@){+uFT3bV+Kf z5m>9@fs2k_=E?xZB`}*L-n7Gub>aJLB)M)vz0Al{y9W?2;(8n^_$4|(hEEzm?8M~@ zl3#be=wSCv%wFH^JKy51ouw-xIDUjgejK#1=H{sBEuVLEBBpiY+MkGhbZrwC2Yhmh zuMAfF%Q41if+-9^`BBZVkP5n3y@{t-*CZ16uCVjD>GBW0ZU%pe^Pw)Tt~@UC+{>|v zU9vj)V)Q@`9rDD^e$1;tO?ClJA;4a;Ejw=hr&5CY(g#xF8k(k)Bk(MO3jrBNCL$7i zRsf4@_3LhxB@K}T1zmR4h&*}4fL`K#&x@f%+UGgg7@@Anj^^IqRyzH17QQ>RDu~{^ zsIaALB$r2$kHsEF+-d;?U(Du-KfTBe+zL@??Qx3(EE=)k!hV4>Y!YgSVI!Rch%j`Z z(zmDxdPdevfsN?b;YF@2W%1I|(kswVHrvg>*#$jmIC&>(T=AnASgru^x{n;^Q8Ibk z#t6(A$b`mV1-dp3*PP&c(c>Nt-rl4DY<~HuV_jfgRz}9?+X4r1ur==>09r#cHKKr6 zJ%O7U$2f{t8)J-&VEW2=^s3$1Mu%=iR50(*n$Dgtm&NwH=jN5G0D`VE8-m0D-cPEM z*Fq5f_WMIES+k_Kbm7TRMcQFbrlXozl*fJ+$$6Pz$J z+gujfhjuFzO)Cln*7fQrB{81F0MAV!nn~-Gpx0!_GaYncaxi@Z$NF0^oS5q1s9W(@ zjA`)&-1%(5KAA)HXv;+nX-4fPwXW8IhvQ-#THX7a>*1BA1MNt>^cWl@v+z_q;U5d` z);e^l1L*B{$8W&24+=nWaM?iO(N&r(LK8lPGQiBzC=rGppw>aD1wL9W#$n2s$_NHO z-HB*ZgLv+cMFZfs>+(W4g3?G!8snR>vBw9PX|K<2h(oEPkJ=HLe0v_SpmOKY_w065 z;`%g?NK(fup7Kx~98dLItwjG52n;9g9fd|L=2njY?PlTMD683=i3Qj`z_ZDgT#Rk3 zdM+{dVQDy9;O-&DL62{fJ04_!dX|X47%6@5EF~Sc@$&MT<157Z^43Vg)#T<*7x#`4 zb3*_kWYT8Cb;SR-D#KrCm;<(a&5*E1Y{#>&0NZKfud*3xHGHj76ab@J%H;L|*{pdX zCNbZGnKsFnlKW4hL?{M$QU-d-_AGa%;znWw`abtyoG~gof{X40+r+UR@C*(k5ij3s zy&$&d_n5J%>HYqm9^-Kj9%W3eCHyolcf11?U}!`DVMS5NKve)tU1`YAfqVf)v}lcAfZ0=9An+`y2xatrj2*$z zjJD*Wp!L^cW=9i}$vB&ibOM72J2yAE6mx1l_C6mGnJR)kT) zhzCVqclR&Q)cX(_I7@kleB}r`v=Z@#Em%Jk;=g48j-s@bLxzk4d}Ie(s{EVpX;+uZ zu%IJ#k<9XdPklxo6J-b{IkdXUded09gYoDKh>GT6_^G(t@!>Q=?SAb~8uGvN;`?Gq zGYx>r^jlLAJW$xt-Nl@={?G3a-|!`h-LbSzjD!B5*x6ensl)aFJ8L`$j#&|J@c+dd z4t4d4_*w3TR-8$Yh_d~7N?;nm0|7YJsPLaqqygej#KsFop1(xpTnD~!wcxZ^+%DV2|RUENiTvz1Z`i#auLliMM$nVd4$X!4q zrYI@txM|^bwJ{ZxE9gz`iN-6OE9m}>s%;8C1#2}yg($lxkI*d)Ln-;8$6qjqr_}yb z_<0Tq0_26WzK@@w_P<1GrKS1j(B*)YN4#GDDo($9A+`^$Z2WhQPaUdL?aK-K47o4f z0K9EEYxgc4z;LQfyNRzct6tf@(JzR?2qRQ+J z6<c2^OHX^#latIWP&Lz!$W_{M-${VvyS@VBe4f3mm{^ z8wAB--+i4zl7pQq1(nG&{GFb{Ay$vxfe8?wMpnxng6=NkvmTySw zzab1L7t(C*SAT)|fDb0fC$o8ig6t{CY`>WLlmo7jzm~ksK--FGq`k-Y$l4s3#ZmWZ zOnbwB$8pHLIk{=mradiLSN&r<7=KJ9OckP+`;MR&7o4a;O}Xw0A9GiTk)pdYP+Ew_ zb=rARS1)-hW7~($IT6fd;g_N2nSx;ODy-+*CEt%nVg)(~t;{sqC8kyS{&oaB2ww1Q zqeLKQu>|(mfZFv%RkFRCwRH`UA&PZkw3KN=nwUB)pDMb|M_UHlIV|>~x&i<*9|EVW z4$}I_fl7j#|7vB54rm+UZR0I?v`zvGQUqti`s3uAz3*`IK=8B|`|8b5a}ID~rcoly zeQ0Lr{}cb^^H(;jny`$t*cM##wR{cDvt~pTULsB4OPsU$6}vA;Z@`W|!}6BXv}Szn z@?Y-??WmE32;hruK)6<*+v4Cn;(vIk|Ka0^e^;lQ?Z{tJL9$Zk3W zE;SD1ZUCqE#yv>#Qk2jZyH&{Icv0ZLm2%Zn3?8@*7z8@}sZ(8t@0&NM z@e!bI&ziGFH@E@2K50wZ2A1h`p6 zN|*suTP@p}nv{<#1^;9o!*c5CY%op`OrnAW%7Qwot++yz^1rr(zXJ zz=%A`XNH~`WMr(#LHGiX>E!RSN`deiT!0h4N2Nk6pFnk3aq|p1`WoL#Kh~GEkTX-6 zQJ|_mU)*a?#~^~uAVUGpJlyVBoPd{fu|*~I_VecLR0HX!7NP>>{P?z`*To7_z;J$H zN4;QP(!@{uM$4-gM6VoFNck~;&GL;uK>feIT>PFhGSB6udoXjKN_$o2*kr%CZ2I;F z%77u&Hx)3jD?45Vr;SqN07PL!yT@S0e!e8zYaXBFwb>oUh?20cw;a98Rk8zFbEj$N zhAZ`G=o-h%Fp_J#J3tB?R?ay=#;uZ(mRt*a%}z2?RZlNo!D~F&A~cmm=G2>N@&egH z0ThtQ?VHf`_p|_f-dtL@qh(G}`;$)79DC@A#syAM4wb)dG*wHV8Y~}gDy!w&>_q8x z`|-q00eWg&O$-Rb1l|Qw|3cI&N8Sw*zVPG%D*Ymypz%~ed`hN2Ud$7kz4%0WGn%13 zWtX%)KsQI*EPZ@el?2!{?yQ$pkvtgM8K5tS8iDLxnDN*tTGW=!nVTF>VyZaJ=RQ|1 zzEWlWk{=U4!J%2!Zyt5WlaByqrQeStXTQ_DKZS76AD%~e{0S*~%v8hs3m<&*7}RT_ zXAJ*Xt<}s66Q?`)siS+ny@wUaT+De;tca0+*R~;EWEVzEUyrlrdE?=I4~2o z-S!Ul_n_T>FUUwK?d3SH`+zK3f0a;6e#Y@LF)uk)oN#7ss6Uqq>5J zUVE@B>$vlN>JFJ>&0#l|Z!PA+ZT_}I3A9a!p% z(HXVf0PhiO1QvVm#JwyMz<$u5f|Z?RDk6ZAMkhk9l@(jbB+k!NFt~4lQ`gWQ&jB~8 zG8o()HXcItHRNH2<%qY=?-@Su_5k)5{o-bFj~`^}LZ^)BKmBMKKpxsa+P3SwEprEt z`~NV9(>*!ZbA!<~MrV4aPW>*MrgevB&&@XJyskEW5X#;*I-9)}6+Adlxf$7R@cQ_u z{0aZdGc!M^R27Fk@REeL2sYAOsTkjbN_=C-%_AcfXXu32gOZC82e*)#V$A`Vo{p;Y z2o|nmqch7A*-1;u>_5Xcj^UGYEMMxEE-0AWvTl>W2vYqSeSNFz6#nusQNpAn(%+!# zyLh168g)z=joFPJKI%)$L2j1X63i)MWr&_9VyJGdxuQy`(R>uXbKHl90gGHQh~=9v zqoAnDW7r1YN!%6w4d&U<|MnQRmKsK24}W%>@rLgS}}*hJ9w$oN=kdxg&7mo^ zP870A5Dx47e{SE0G=U&`$hl*2Cotk3u>BX+IH+92qFGuj66Ut z>0@lc4f~UQ%mE(|{|loAK7N1WYxu1}mEhR4BVpfW8o)n_cv-#sRN|KgzY=X!5s%Kc z?$C*B7|{SMJpa_p1RoDKA*~bpg+EH)#}bh+%85-PuGV~xve%y|%6w9^+`WK@d|HlRBzVzN;E1XN^apCbo(17DCAs?;gDPc?qCNSQ* zSo}bhxTWDuFzQf01=~b{%Zc9LDSF+dA);}@2NuKq6*43cG=u@m|7_BavSNtQVXkgR zG1PcG$&iY1=;3`V5N#a&c8KiaCA$Te)c0fXjYGdj@5FoIaL=7GVlY~O1@IC*YedQ- z^EOrH!)VK+PkrPp--XhB?gnJ!*(N%0SpdO?gZiYdvli&`CD%q>fc6Um9^x6W&}{<3 zXyhIT7CP3mIdgey+Mwfmwnz3#qb8b?F2vp!=*n5C?IlM6krRVLR*AE88=Furlb_1i z!zz3OvdWkA^JM_n(%LU>(%lpw_jX{wjLl)+PK{U?*gUIqTG?mfWZoV@{k2ZyN zp^ANv9_MLBv}MY;Ds+s`a&sjrMK+*P9R)PCBWpiJSrxr<>J=o~*UTX&5gxD{MnsS8>`^0B8nMd(yp4H4q0Rl+%m1Vmkg*}~h%n3B*IfMbzz_`Bw-wkz4XTv6pd!4t zJ~SYj`-M^3Zw16c9`dz7gdEV?eNiv5P^;#qQ4fJxgb2c>X@sScIA%aXCLJYzPhvv( z1TzCT^PlIUK6cG)U~(S7StB~Lj`nt$uZ@KEg`Q~=p&$IX16BwUq%lcoaRU{{)z)?_ zVM$zFZ|`P{8}b%RyAHI01wl`DOqT@8p9^#oA5@^lZG1sUfY`o@>_h~Dn6NC3oLItB z*l$OpPOu>Gyb923DeLT9k7;!oy8S;-E$|0yg|#W&e&Mg>2nD4$`MPh7gu`R8*Ow+d zotBsm?RPI|1sl-}3uAEfuHeMJ8$5asLn<=dpy|Jf=*Ntke*rA5R6r894u6fAeqDRV zBKI6lI#oNxTQ`*P804NkzNzx1FdJP0xW7M6t}~wk6ab!A|MHh^`1n31a&Z$Tu_jLi*^gLZI zKZpT$7_9oVuFz3X#J{tGAXUii)a|CR%!^y`o?Hq0x+=MZHn`?I0E!NP@`rmCfW$!a z>xCHtxBF=u3U$3448ZQE3vIc_C_H67f{^(}RV~|mv|jSgaU0zB4V{Kz=7)sXdLX3J zz{@gcau3UUTR(E@FOU5?n9!Ch6P*B z8=SC}{5+=b)?M*ScZaa+(>@u`zj^^?br6OE_ZmaMmW~=ZjK5QQ?Mw9AkyoIjyb7wn z4-k_!5^GQKfTmT$j{kVSL0bDNLO#=w!czmE9Lz&Iw7$Cy7v6_>(}~>~RvvEwNHI>F zh=2hZc7sFDi6+Yix9T;B3tJj~?Ur8;8(A`wEqJdGF{E@3%t|pdB1?+}Fkl~Tpx+M$bK9xYr)6+7kI}cHyt#>fcvX3rMgr(fMtOcTihDwKYb5$U!uXlZu^@{vK!?r)L*H$eGD3|GB-&ghByQLcp>f@Wq9tXm2MzsCct8Y?ucoqDI>{eLouUHm zVy@=4vQMnp|$!YsOW<&UGNMQ~ethxSDIOtT#qJ>wqv)dDiDyHhhxmW?H zQDDeb5A-<+-4K?PEhE3|O`RsYYRBbFa9EE$BXpCleCu+Z5B#hYs8_Rki?8^lpdHWk z)JALpT~A3nR-oFc&v%`tY_biuV%F1XoH&?^(q6mm)j3RS9OZw|gPDP*R}phK6rm{= zD6l2*#NGL}|0Jvu85F<3>CMr}Ezhq5u$^dA9d2JoMzISD@zrQ~VS)Lw#=-Kf8(z*e zSP_)PY}}9Y12AQK9>w+)BiP~KvF*Qg><2k%pdD(BE%BQ>U3&ci%SRwkVCFt^Y>|Xbp(U3k!m$&A>qFg&-u8BvL%ZUJ z+l(p$`SS3IqOsAcr?>Zjw(X~r^9;l|7%z3_Kb z+UZe-wZA}lQXU9tQr~|mRO*C75QNXeR{`4p9uR8KF!M?75#wO0BP1qf_@08fxjTVQ zFhSy0BuvA{TP_HB4yawg-Kd-ut(?7urczUW2kL+~F56jmfN=gx3#+TFQ_Z@VE;6l3lr|a%}trRrM%ihX_Ky0<+e7z(CarxB1EA}t& zwb{D`1dLR0@xW*Ng@@BjYK9<9K4RYs;WMXQ%~?3kT9P|1*6xbcmx?XxQS|Ktn`+WU zqyoUo{|imG4lskMivJI{oJim`$99avcKR-WVQW-|x^~Qq&uuV8mdC0A=hc;^MVxib zzY1VKKxXX(qZj=b=B;xTb+$Owl?(Qj3zgLmcIMHBq5yDooEbovwm!YA}e~RS>Km6HS=HjlCw7zW+Q4X|USs?fN31 z*xN}GZ%k?ccJ$?Yd$x+_eMU0uLABh`^SZ}&B8nD8lO$Ik#)c_k0)nWdd$39YE0iWO zxVKaAT!5kDdnqbR?#^Pv&@G&@5ilhFrmAjvzWwtT zGgOgpQCU|k6y^Gy!`IM%505+;>I@PZ(}F_4)<8apqO=SU95+!ph$mr(s6V3FAY5rI z0=#y|5Na)914w44$4 zmPJ@PJxs>W{lI=Inq4$vAA$TiN07qmx-RqqA(nqIcT~ZcA>~jrLR!1u(>1Wb3~sD& z-k7d|S&I^&gLh;k3c!+XViNg;Fc@ZRPKTtA`$UZ9{})>TY`QF&fxK}z7t_I!&a7VO za&Y%Lpkk(T_!{so4A~JIiC4e4gnP|?zSWj8l@f;~!dBbYUlP_Nv`#SYLV|=yRtF>2 zp^VOk@L!}+9R7_Q{1Z8tcJ8z9#6x*wb1q(9zmmd2>3?^luNA_G(;Xw6{Zt%}7yy57 zL*8Jb?_c1au=(dV1ON(5=?oYE@aO(rRqvVMz>w-2sY7`lx|#_3O}Byq*TL~q$; zy$EzSgmJ-LBT2=`zPU6ij{hOQIa~vDt=?GWcM&QK_siUxBU&Mr`q*z@iNM=P)CeM# z{kxG}p}ch-RWB+fUu7GrCc<6DG;Y2+@M_mP%ow%&@J-f0vs25xdKu{kj9Tvt`G)Y+ zKZkdZAYS&OZ0`oT+mtYrCt@E|Vq-C4J=Cc9Fc5hOn$lGgVJ@$!cujBNZol(9!dEo6 zeSfht)kbF3byPU zOVklJHFnYNNUz$pQDBF_18(E~SmXOOnu|1(lLZ$Vc^)QS7WkW;{`h5CY5TMJob%oM75nM`<$Jq=!LT$pE|F<>cg&qJ?G3+egVViA*Pq4-e6(+#p3d%& zWSHx^E(y9mu~W=wvfZZlmgW3F=5-f(IyyR>`;ueIW9ySyU_~nb5u9I{H;YH$UZv@L z^=f9--E6jS|J7CBh6GWAsD_<>R22T#uU{{OKMV5oPRg|>_Ms#4(1NDm0^Nh4hOj>} zbs`;Tm>3us$Zp2k#ak-%)ywfbpv_|!=_RsTn${%IW?f@`8fv}~2rxq{?5S2tqi|!z z%`3cFwLd{j2!B&a?#;xBpa?yya)&?xb_@&b*s((+1?I_=2)@MBeH-#)2lie>uDF0( z1PhT8J=}%^Uk0~_HtV#!{`6Qo`6Xu33C`9wkXg4(ju2irxm3f)22~(7)rT}!5l%*2 z;V_ixb12S5v3fA)tS{i~i`d$0gRJaWX8OMT51{)w^n$M(hu_rI6a`g+4A;q{3p){bBif(yHaJ;f zhg~*MhK*Lbv4-I&N@OtReuhwN&rVlo9fmQ4H(93^C-nBqkPn^FVn&jgCoIQ>HC!!W z)Sd>eu@htjI!B+*!YT`XR%S6sKIbkrc)HDR$PUJ~7v-)OFmFw6G z?FF5w%rp3-Nxptbc-MppyR|$@hH*fu_BGlO;)HL{H>o))I<&YPjCZ*Y8BMO5b}|>w zy7XfE(`P^*)&+>ZlBO$$9;vIf^%q}#OEhZH#Hz53cVtBJdVlt#lj9`E00^DwwRCWR zPtN&_eQ{| z=5%B*)CeWwHJG6Uw@^gFIH-531SJ97M!vyP)qt7mR~HXZYHnpzz4_DodU$B2Pkwl9 z4}OklDxIwn2NmVI2l!FgWb?C=-)2{cB^$nGFU%Gg0ckQ*-BaMe$+e#b3sdk+MBrdtz&MUO(U2%+^gac5 z1#=*0Uqx@?%R)=#&0j9J3)i^l(W7%4f1mS@zM9&?`TWU~E){9%uQx{Lw0@2y0IH+3 ze;u2siVyeSRvmVNBa~*->;CQ9>GIjiN(p{(MmPo+u}YKHY{D&n9HLjyIet%o27I5T z=`~r{xQsx*c9~xP%ZCHhA`IC1{9e>q$CxV`W+-Go#%lZYVswd9463D~bMIpJ0%-F% zfboJOS-)fjLa2555+YYhGQ!I_E-f{mnV}(zX=K&s4qbVcCkuarV)qNLDv3aPM<%aq zIX}RA=f7YFXO3cVg^u~XJ@eqsMBeIWNh;q%sB9jrT@-oGK{Z zXL1blH@sGPa}L1jFi6u$c#RGuh@>}K16??Y0Wr2hlsnBtRX;=l06Ke5LQG5ym#HNr zm0QTZ*xmVDeRrD1YS~54Tndr>+t#-Y(Q*Z9vgX>0BPeiVQCyXml(?_EBv-R6#?9zO zmj2=BpSA%Y!`t+lSTlG{v}N2r;Q1?Wc(+x*QGqRcu5r;t_Ro?B2lEf|@sS;XACNMh zNB#bSDA)w1fAB`uUB^SFH>t%|SF4`K<@OL_3%5HG$wzw;UN~n#Qr}on{K%Ra72-5f z_fc#fY`d^s4YWaCdB>rHumD`Uu&O=sVVQqBiaB4H2%AIJV!MAbq{i}NYpdlT*lI`f zZ=6F)vV&2GM60y6+R&lOew<4ahYJ@<)>$#%t8w?N4%{G`e^jfT!lXeY-0B;cV4)am zjA3!zt|PlIqQ&2Xl3Q{A*3o?VxmBtha;jr9z-f#a_&PGT^oNKMo;-W@PlUQd9sgY7 ziB#osW|R>M$}hy|f$uEho_OKD97vo-Z&z`lHT?zVz0!u;Z}~F9`0XqjQQfm=&b$ms zf6{O!50jYfXu;e`M7^+PIx_Tca}=7b^3}hSxmW|Ue&tS~GdrX(z1YMxFUGsp7)~3cZH-=2Y8k~*o~XE$(H57&e3rMv=5-2M3|gY3h#{kTPL_{ zuo2A}x2qSN&@*i6u#u8*- zXX&y9bU8mb-CIMF&IB90{781YZ;kyT5ywH9jL59J^CM_HxTvb;!@-W_L4Z>V>t+7FdP&fiZ(+L290X2;?M=k-P zgfT5FFBIu_rO*6IGzD53(7XgNOb(xmZ5b%anIS8*Gg_JfJ``` zMB=<5YaM?2*C0MxeJIOIY#I~yIKHIcWfySpV42fMeG_gq&rKU&GNyWYseAS=AYwJy z>+Cn7cpW2nLVk1REeKc;;Y#bQG_1(Ns)Z*~0Tdqrt$cBm_Z(}!zwOtqpxv0#VrOze zCJ2Jlp{r*bSYPTXqimQbOP6mUH*T2@$OjOfdLDLK)Ae88-r%EE05qshwm$?OH8mDU zzcm9|D#Tgk`R{pPNDB-o6ZQ2TRc5YB$1sCt_Rk{;M+O@z$031(+bUqGO{AAp?s+zZ zi1pF$c-D@5)R(6vs{=UAVii+}Lraz+PbOxAmH6VO_-}f_uz-UUC@%rl+!YZOU95lo z>^^V}5{I!^s?FjgB@awUTk-8k1lv%v(Q)A?us8wN407C~p)jhPYd$c|6?tU+@wPX^ zlCY*sgWJi_T#Jfd=g2R4>sR~nNX{xCfOzC3Q#bwbRyO~J$mlmcF=4kon8myUsZj2g zz?O|(kMz0SU@sI-3QA~vAAjpqA_7rpxR|0p-xX;tQ)z`C>0q8^O-O8PtcP=f;)GLk z>i(-^fAEPU8uS&Q(5%P%{()Mp@f)=gz&!2$s~_ z#?Ac$8zdb}Q4Po$f}*kjCOr+x^Rs@1l^)!#53d5*eKFuZ5=n0IA+xPPmxn;;uHbBR zCjk#QhPjZK*u9_;dCE+ejAZ`*BE`ealkkChjLO3qF8=~1rQzv9%<8w+;I}W1?|dE} zD^f=)$>LOS3(HnQnTKlcEFKk#)V{OVCR|Yi%I&IA=U@T~mjVqrAy!!fd_xxTN(*h5 zMdpdN^%3aD=7BrVSUr6#zCn7BJ%{3W7)0!YpUx@ zDXZThy68DQ3oGlVjvS*o7VS@L;pw+Rr~>)k;Id{Twiv-Oe^X8V6pHDEmD@SnXr_g@ zL5K2K{#iU2c^Nx{Qq2U;l1 z##V_+C>kuGU2b=g)N{0xWy{}7GHk-u8Y(O<3Dgx5kd>D1dxZ}+frFXh>YFiA z_rywxfO}gxsL}-?vIXPX_hmVm6m;iFQ`^HVH%SGt zs};GlR@zrBR^Sy1x%>E8w*{CuA5pz`gIXrqx<8egf&wOE`-NplQ&Swo zG&d7|VV6-u`^#oHO7xPqP9Tp<(uQtz;p}G%3SR7f6Se)nWdf)eXn+DIV=8lA-Ja{s zuwx01_-<=tj-&4ASidyM4SHXFbA2Q0IZoD#E^4T<*T}Nma<0ZJAD}&U%fQm!svPr| zo34I?DtsEjtnNq9e^s{U{C7^_@SP9ROnbHpz(cKHNJ!`{I`!AXR>aCIG5T7Z4tJT# z=E?u|g7%d-J@gj!g6$%S=|0P@O$1A{6Eik_H{~~mgCiRw5ccje>~Lac@a+xYesZ<8 zSJLJI6OPgQ%fPBwzb*?{1Xm9`UTeCyzksjj^@N=T`5KOx*iR&p-5(fYsq=`VwZJ~D zak4TiuE{ncYmCr=dS6~%e${>Hg#XinDH{Ld0#pST*kO`FtR38ZlvC~54CTBK>Uz_Z z*w{8d5E3D7Hm=}5gLrmQz4AGRv9Iv(=2Bx_MuxVlc3*^8YLZjTFi%%mSNM(yJsR9` zB%`PXmQa+`&A5HTh_{uLHIi&6sI(4UT}2{qK#I+_-kuBFZ{u>$`33Y%mpl}4LNO@+ zIP#0(c(Uwe&EN5dL5%iUfbK9dvB3ckvF#l|Pw&ZR#RC|W->U1#+tCV@b1xpVUw!&k zn6N_oJb=4)0DjL*))NQ$DB$P*4dWqYs1#`Ox#Hi(R=>0F$nm)K*p4!UL4UvT1qX-c zaCc2rzNbx!l72J{i>seWtcVlT{Vj_A>LU6So|P?Pk?H8Qz*ShCXd6cr~QaAD(7EbP16pvZR2t(gr>WPo%lTT|cAp5}_pYKGh0RIO@!Dv!g zVri=ZPxeO>XWP_Lb419YttamR!)&Q-9Eg64dNp~HreR!7D-Xhk{v)x5v|xjN~)`P z8rOAvY0bdrH4tKR*Vm7=k#ET-ikfoXp3oi0R*Hz+P@47|llm~Ren{UwwWT2yeR{2d zxzFh>TCuyd*Gpi@v=az!x4naO_?Ve1{(jGX50s~nzNCwk963?$^Sl)fEDxLHY?oI(|Oa^0|=sK@&62KiInsMlYib5L3KuDH!{9fi#t zL205ug?M|w4pYL?eg~Cn-#(_6nO*tdYYq(y5n_-Eox_TG*F`XBTF&jY3$AzatcV?)1J9E%!Wt?|Xq+t0<3uG?= z>I?W!1_rFdi$DvxFq!m^F?^p1sOFZ%)ltRFa$k8RvBcQQiA@(Oxvx8bIeiu#g}^*u7Xe%zh`AV&I0i7l$aO`XmG;6b&~0`?@Tq#^qTJKYp0o2 zildk+`TmM9UwH#M%tI|}guG%r%0&#;daRbVg8_k{<0-gX?tJ(qsg0m=Vg56Or?J{I zFyO1wF@1=c>J>ivcD#>I79SXEc=gy|dSM}nR@_7WR}*TRig6M?QaUEtXr?8@vIXlD9NGcyQ7yXUULuO~%E^%8 zvkUCZHD802@>o|hBX!V0Hg%^97v3hu##-r#B%C{C#{dz&;vZs~Slnt{^jGbkd)&_N zkj+dcU#VCkuE16F8;f3puJ8~2#j16Vf-%?~-8fpk8X6k!Vw@gGLK#)%gZ;NE2e_kd z@4?8$l3anU(#!$Pa|5(evlnj82ZZ}3D|B7%dO`#(FnggiezfK$u00YrB zt-KV`XAWU$me%yQdC%?F9>NUJI}Q#VB4%ANAY}D18R~UE9@-hB zeZPC5!vzvdw?Usp37wPMDrrC;R)!m`w>0TgLRj?~wZ8tcR- zX<#2!PKuNRD2*ONCR4$iy;s|6u@=LCvS$zvoJ^ghKOZcFjM5T#74$JctbNjy%xSZOtVEIrg+StQyu*;Gaov1DDY-5 zL;zS@_XmqB2Vw6d)h&$i^-nz8L98kZ%X>^O!vKurIr_9UI|~cGF{-e1A={deO{J(% zWB4O;8?U5Ew#=Df8D2z63>w4-Ix7EuUm!%98a|)(%01iBZiLKN#@!wnFhFPJ1 z`m~E!N5FgZc^RY{r^o8lJSBQ9YviJAz}%Rx7P|3u^$Da$AeUEfi2JhifoJ<}c;sT{G=HxZ=pPG+^JXW7*cd`AqmBN-QcH&Sfa{MMJgqI*6ob~?57zdD zU--XLUSMo`k#iL5pK!9nZ2POLs{^pJsKxL5^z<}uMCZ(%b7mL1PvJ*y{h2*Ew{#s7 zv{R(;bH2$K{Tb!x8ga3v+56yw`d(uHp>rflIz-~^%S$I!RjV(-hvv86yfp(Q6TsrXi3gcUngPfKJ25|mFgKOC=ieP{X7;W zrtvG&hUHN$-0q+Qj}hd$HC;WzVzYV0H!@B6fp*4PXq|i zYTuSQY~XDow@0L}m!5tJ3ka^cxsl=V+K8dI3qA^3O(}xqz&Gi(_f?3j-ZUl4NtofK zHj-lv%(*fr=h6Xnz0Izn?2@p8N{Wd|gV%+z3^hRGk29pKot3sHy}?)@xOtr9t0~7T zzB&4=VPrE&fPaxCrEJ!ag-cPK6yvIIiON&U_ABjIb|*auti&yH2Gub_c!~Ue#@X4K zu55qWS1`dVg~F9_8`$nYf)u8TIPCwz!{CjYpIkZ~ya@xZeEh(lSQ#LpWdcefu%1Rz zzC;7TyD?srcBYujc0w$LqDD3gTk$au0ZsILih-h4PV`0WxrJdwFsx+E1SR}bz4W1n zzmH@a$zz>V_*!lOk7(Mi^Lu^uwz}739z$HWZCXc^+Vm$2NU?g5;ZqfuqW{%fmTHu{ zNHqrB{{YmCUQ)*Y(44?TsUCNA?F|^(7G)5OtPk+VCdg(ix(jXn?m6Ivy9$2BWkr)u z=c&sesU=nBT@*A41>!ApX}P&A9+;X{!r;l!kn?Qeh1Tz|QrV9^l=_kEd1Ca6JWK{g zMjiwyk^`_cG;Ne;QT?4Dn_wpf7;h};>TxJ8Cc7XRGTY1H-%*FJ5xMah8mkxkEYbU- zHMhBaEx~dDyLoCcBR3~O`gs0x^ow1jnSuNN-g?HyE9ecL0sQ;}Ae;q$Ngfbjs~`?( zeoJID@@WE4JbO`^UC+fh{O z_TwtI&9}So)UBmx1IQ;M3jMfqJARX{*y+6>)L#69jXA zkpKMbj_c%3>ae{$`{ke2)~CRGz5{rG-+s%3s~qsdak2%X`V0lA2?>17vv0j5q;A~UV?SS9+Kb>UFA!#bEyCKLD4qFQd<(p?=tiC0Tt{BX z@C_r{>yEs=u7L+1T>F2@18Ejr(7Bz_c=-p95G_h4D)EEKnNIbEIh)-8rZGS`rnWKM zrVYci&V9@2J0)hcP3ne0_ni~g&G1Z^8XZtEEMf` z$glthmM991zu3V`N`Q##I$jI3^Y<0E9#b5M@dep2jE$HIge~(`&znpdRY|G`iU+ zVEww&CZd{4U@^_SJUwr|)o1=~gby_}P+AyUWHt;HM#>Hp#MX)SJcFTY_~6RRKKRyA zoRb;Cih#z!Q7^T7U1+vHUhhtn*f@B3WuMEFh+waf>))~N5|ME5NKeuka>4`n{9;@N zm_Epa6q{~TKXmJ*HtTSJ+j1SpZ@uPl&n&ty=oJ@KB-Drrs4XbM@hyWky_))%R z9e8zQru2&9FO%@#IVNCwt=ZVnAXL-&i(6`E)XBlU#^Bp;hzsr^{3jQ0_h-eL_=#m0 z6eb!`e%-0+3$vbjjNTXcTqn$v?^|wC32`yd)B9ppV38zHHn+DYtA= zIdD5qC0iceep@z(O#(Z9vmp(dA7R706gqiAu~^SyB4Xe@#V3_Q#Oq-LMDw)F2G)6j zOmqRKKwLJG+W*Dv&+UUymAENrY56a>KI>?1cJ(g~bGg6cCkU6rINFF%u>B=vw=1Nh zeuSqwncj;gOBT77TIUw>Zp(ih@DT)z1yFt-CG?^}Rj>}AWJF8=o*OM@B+H4#BOL&;NXXTfgd@Bk>F@K)eze z;q_G@u@|rG82od`3nBv@cAW0~wF8i7Ow4obc#g+uBo^;lxDn7N&Usg|H(O8&DKkII zYR8eY6&pCZElS^l7FoQnpjE_pTJN8(o?S#G?agK7b+opa+-1OL2ceI?X@ijL zqD|qx5t&XWKO`%4pryAs-!8W1{9h>5e@7jtf)O?r170qmYGeV4Z&#t)@;euMWhobb zJA%qT8`9Whe@9pZ z?M(udRk&D6F+AY&X&LQQr^7GN1LKMnt}K*y1h{h!({8g;u=X@gZxsn2DIm4rIgCA` zZmQpS=>3*+K6hn%e$dci=4{C-qWex6@J1om_f|r}bFkt}?mvF2vLVkg5T|a_u2l19 z3sjD{iT0%c=;g*L(r?hvTVVSI(k1Ex-Y^W)N(N(?F6noU3|4Ts{CMj22^(m*2=jea zIQW^K1Zky8A3k)b?t=5xG5)V%?>bBWypspsdX9aq!TEkfsCF|`tk@H1vd){JyN#|Z zK%eWXS_r|zQ-Wef3x(C4Y=x2$i}`XP;B+pHU8jx)s*rOG3t{_1$>8NHB+&Qrm2?9U zOP{kg2 z=iL8bod6$VtgcX}Ukglt&@ebaB&$*?`l_KEYXhR>X`lZ4FoZB9uc%Hwf;#9BZ#O4Y zFlatUkK4E)G2$gEk(rtMsy8=ZI&@#t9@; zVd6o;JI^BX#%8$WVGB?@Zkq#K^)9Lj4%HttS*(Ec3FoVTd}j8sp}jbO{RpmzRaM@u zIFe$H?~Yk$&!8$3IvlVbLI%`enrJ<{dN-=~(-*@dwvAA`kDq;#yCDMcD3NSz1)8#M zjUXoY$yw#tWx!4SZc`ihdXz{cZY%MnvN-ISsDsN8-tR~45r+gbKpp_@uOZ{o(+)k0 z9P1%L(hg=rfXpwqzM|>qYbqV~^al?f2mymJ72H-{Ta9Ws%iz0P%h>Es@Ha1zj1=7{ zxGOcPK2V%N8K}%gAOoa9z&she5Z>v~|k(e;(|4gNu zAUqij{f1XTbzn`5BV~9H)mZX9V$<4_raVv3u#GQ{PoEMwOJax7KZ_I$A9Ze@vh`n{ z{Su=raXR_r|H-MI4g^g@;Y2zfpuP@fpV4!YPXq>dY@i%R5!4r2kI}CkIDEJ;!am7< z{cA{ocqbz6yHRzMY~P582v#2rX&(t%w3!EYSZ+ebWAafet9gF-qwewrcSyrt22;kz zQj7UtPK4;?;IFgTQN$8d4o2_ZejL2u@ZX1-eTLR>7&vepP!36`(fG&BKoBzL$z1J? z*OQ5ag1j&$N3`=EGST9Mi0B1$Fb@yUFjSS_neGocw6G&M3DD6aMZ7eDggUzndso+H z8&oLnIJ%nP*xKh&Z--7EFmdUUjD#~*lxk!@ggE+B&yy7$H$!Bl!H>UjojSrAKipH# zzh%$ETjvIO7;Pd3=enL!^k5~u1>{ejtX0v?kM-Vdskx)#auAst7ZKz0_Ex5oh?*lg z5PrjdaB+e)MPaQC8h;QsQqgrqv84xrycex!q&0B7e`?$9XXG7IC{m5NF`3Y+4*>PH z-Z=Kx3&j)>tn9s`oXrk%&amvw7wf& z4>0T~fSz*%bkreo5TVvPoVJS|8A9G)cZK3BIJp@`!X4hQiypf6-rinw@RG|h)kXNA zfDewn$Klb1jeTxa~> z1!e#+N}?7qI(AUHo`7uCoc3n%cyn{~B3j4;FW&^iodfi?L@)c`?$NplTigl#=mp0S zLZ^Tyll*X3C`9|II3!0;?R4as?u92-qF_;!))h1jwvbC?dMV0wO&nDE0F>w)j`1iX z(o_j}d|mOzV_9E#Z-j?)gN(bL#^}m_tt$Q!^gVRgZLmDZSxRy4nK^?ush%<`UGZRGfvH3w5&`J;lyd&FXve#~$Dlme1~7f+hwh#x(8#NqDH` zDnJblkvu1m!*WnF-r%~&5+w8)g?J&9_WXqoJjKxbKsHADX-xGHh?OQ41h6jw0(8HY_2S$YI~^xA=D;iV zcprStij4)x4H9{4>@WA9@Wo>m;qQ%3#dlB!oRQ}d*?v5yf6!I+tYtlWTms_$$H*hW z39d8dZ$#hFgX*4m+q7ZOgRYr&i?>E69TE27sFf5P*Hm*jcmR&>`}oT?WcOgQ)UVM| z=S>arVu;ZuMn?#rr7i7qi*!|Fi9HnDTVV#S#Ug(W+EA?7@J3J*sBe{ww`{~UT8qE5yOGlf%ucY z#R|*Ytt0%z02ijz4P#?6XrB>i#%Xo*3_1`fL)I@0r^K_3%wCtr^>~3uKR?nx`Gik+!w^~r*&q1Wj{wTX5elFHu33w2e?AaJ>C1O1hMc+ z=f3CNhRwqJ39$% z4R*v*RmVD2Z)|DoitP&4!ko@TYgn{fBzQlrDctwql0p#EV$X9+JCrm~7ZeXyS{9pB z@a@WV<3MeFhn}9EANzz5uE6A~K4jf|^d+lF#v5W={FU1WPi$*=s6$pD-*uBT&}9g6 z2|s!Y$!)F$NAIHtUa;EK2K6!;qFZZs)<0N#8!4z5!TB45r4V2XwU|kr+tQ>l4SNk{ zhZG?bsZLnEwgQ`+)BO}bBYnb&e~8oiyKX-nI{>P3`3PPV?%4_HH`Rk5Dr6xf2ZqSa z8>c=Zb|BzHJ1VFyXr;X2m}V-DI>v3mUW1SD_f&(POJ@+;&i^EC0g&(5@Gkm@Bp{m3 z2t^p0k`R%NJU3X`*whTFuDy5MCXOpWAmT&c8f5Er0YLbG)r

8C`?hs}Qxv8BOs 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 _createFixtureDefs() { - const entranceRotationAngle = 175 * math.pi / 180; - const curveRotationAngle = 275 * math.pi / 180; - const exitRotationAngle = 340 * math.pi / 180; - const width = 5.5; - final fixturesDefs = []; - final entranceWall = ArcShape( - center: Vector2(width / 2, 0), - arcRadius: width / 2, + final topArcShape = ArcShape( + center: Vector2(-35.5, 30.9), + arcRadius: 2.5, angle: math.pi, - rotation: entranceRotationAngle, + rotation: 2.9, ); - final entranceFixtureDef = FixtureDef(entranceWall); - fixturesDefs.add(entranceFixtureDef); - - final topLeftControlPoints = [ - Vector2(0, 0), - Vector2(10, .5), - Vector2(7, 4), - Vector2(15.5, 8.3), - ]; + final topArcFixtureDef = FixtureDef(topArcShape); + fixturesDefs.add(topArcFixtureDef); + final topLeftCurveShape = BezierCurveShape( - controlPoints: topLeftControlPoints, - )..rotate(curveRotationAngle); - final topLeftFixtureDef = FixtureDef(topLeftCurveShape); - fixturesDefs.add(topLeftFixtureDef); - - final topRightControlPoints = [ - Vector2(0, width), - Vector2(10, 6.5), - Vector2(7, 10), - Vector2(15.5, 13.2), - ]; - final topRightCurveShape = BezierCurveShape( - controlPoints: topRightControlPoints, - )..rotate(curveRotationAngle); - final topRightFixtureDef = FixtureDef(topRightCurveShape); - fixturesDefs.add(topRightFixtureDef); - - final mediumLeftControlPoints = [ - topLeftControlPoints.last, - Vector2(21, 12.9), - Vector2(30, 7.1), - Vector2(32, 4.8), - ]; - final mediumLeftCurveShape = BezierCurveShape( - controlPoints: mediumLeftControlPoints, - )..rotate(curveRotationAngle); - final mediumLeftFixtureDef = FixtureDef(mediumLeftCurveShape); - fixturesDefs.add(mediumLeftFixtureDef); - - final mediumRightControlPoints = [ - topRightControlPoints.last, - Vector2(21, 17.2), - Vector2(30, 12.1), - Vector2(32, 10.2), - ]; - final mediumRightCurveShape = BezierCurveShape( - controlPoints: mediumRightControlPoints, - )..rotate(curveRotationAngle); - final mediumRightFixtureDef = FixtureDef(mediumRightCurveShape); - fixturesDefs.add(mediumRightFixtureDef); - - final bottomLeftControlPoints = [ - mediumLeftControlPoints.last, - Vector2(40, -1), - Vector2(48, 1.9), - Vector2(50.5, 2.5), - ]; + controlPoints: [ + Vector2(-37.9, 30.4), + Vector2(-38, 23.9), + Vector2(-30.93, 18.2), + ], + ); + final topLeftCurveFixtureDef = FixtureDef(topLeftCurveShape); + fixturesDefs.add(topLeftCurveFixtureDef); + + final middleLeftCurveShape = BezierCurveShape( + controlPoints: [ + Vector2(-30.93, 18.2), + Vector2(-22.6, 10.3), + Vector2(-30, 0.2), + ], + ); + final middleLeftCurveFixtureDef = FixtureDef(middleLeftCurveShape); + fixturesDefs.add(middleLeftCurveFixtureDef); + final bottomLeftCurveShape = BezierCurveShape( - controlPoints: bottomLeftControlPoints, - )..rotate(curveRotationAngle); - final bottomLeftFixtureDef = FixtureDef(bottomLeftCurveShape); - fixturesDefs.add(bottomLeftFixtureDef); - - final bottomRightControlPoints = [ - mediumRightControlPoints.last, - Vector2(40, 4), - Vector2(46, 6.5), - Vector2(48.8, 7.6), - ]; + controlPoints: [ + Vector2(-30, 0.2), + Vector2(-36, -8.6), + Vector2(-32.04, -18.3), + ], + ); + final bottomLeftCurveFixtureDef = FixtureDef(bottomLeftCurveShape); + fixturesDefs.add(bottomLeftCurveFixtureDef); + + final topRightStraightShape = EdgeShape() + ..set( + Vector2(-33, 31.3), + Vector2(-27.2, 21.3), + ); + final topRightStraightFixtureDef = FixtureDef(topRightStraightShape); + fixturesDefs.add(topRightStraightFixtureDef); + + final middleRightCurveShape = BezierCurveShape( + controlPoints: [ + Vector2(-27.2, 21.3), + Vector2(-16.5, 11.4), + Vector2(-25.29, -1.7), + ], + ); + final middleRightCurveFixtureDef = FixtureDef(middleRightCurveShape); + fixturesDefs.add(middleRightCurveFixtureDef); + final bottomRightCurveShape = BezierCurveShape( - controlPoints: bottomRightControlPoints, - )..rotate(curveRotationAngle); - final bottomRightFixtureDef = FixtureDef(bottomRightCurveShape); - fixturesDefs.add(bottomRightFixtureDef); - - final exitWall = ArcShape( - center: exitPoint, - arcRadius: width / 2, - angle: math.pi, - rotation: exitRotationAngle, + controlPoints: [ + Vector2(-25.29, -1.7), + Vector2(-29.91, -8.5), + Vector2(-26.8, -15.7), + ], ); - final exitFixtureDef = FixtureDef(exitWall); - fixturesDefs.add(exitFixtureDef); + final bottomRightCurveFixtureDef = FixtureDef(bottomRightCurveShape); + fixturesDefs.add(bottomRightCurveFixtureDef); return fixturesDefs; } @@ -159,6 +133,52 @@ class _SpaceshipExitRailRamp extends BodyComponent return body; } + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprite(); + } + + Future _loadSprite() async { + final sprite = await gameRef.loadSprite( + Assets.images.components.spaceshipDropTube.path, + ); + final spriteComponent = SpriteComponent( + sprite: sprite, + size: Vector2(17.5, 55.7), + anchor: Anchor.center, + position: Vector2(-29.4, -5.7), + ); + + await add(spriteComponent); + } +} + +class _SpaceshipExitRailBase extends BodyComponent + with InitialPosition, Layered { + _SpaceshipExitRailBase({required this.radius}) + : super( + priority: SpaceshipExitRail.ballPriorityWhenOnSpaceshipExitRail + 1, + ) { + renderBody = false; + layer = Layer.board; + } + + final double radius; + + @override + Body createBody() { + final shape = CircleShape()..radius = radius; + + final fixtureDef = FixtureDef(shape); + + final bodyDef = BodyDef() + ..position = initialPosition + ..userData = this; + + return world.createBody(bodyDef)..createFixture(fixtureDef); + } } /// {@template spaceship_exit_rail_end} @@ -172,12 +192,18 @@ class SpaceshipExitRailEnd extends RampOpening { insideLayer: Layer.spaceshipExitRail, orientation: RampOrientation.down, ) { + renderBody = false; layer = Layer.spaceshipExitRail; } @override Shape get shape { - return CircleShape()..radius = 1; + return ArcShape( + center: Vector2(-29, -17.8), + arcRadius: 2.5, + angle: math.pi * 0.8, + rotation: -0.16, + ); } } @@ -191,8 +217,7 @@ class SpaceshipExitRailEndBallContactCallback @override void begin(SpaceshipExitRailEnd exitRail, Ball ball, _) { ball - ..priority = 1 - ..gameRef.reorderChildren() + ..sendTo(exitRail.outsidePriority) ..layer = exitRail.outsideLayer; } } diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index cc8aac9c..e0d25592 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -22,6 +22,7 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.dashBumper.main.active.keyName), images.load(components.Assets.images.dashBumper.main.inactive.keyName), images.load(Assets.images.components.background.path), + images.load(Assets.images.components.spaceshipDropTube.path), ]); } } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index b5162053..0711e677 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -45,9 +45,7 @@ class PinballGame extends Forge2DGame ); unawaited( addFromBlueprint( - SpaceshipExitRail( - position: Vector2(-34.3, 23.8), - ), + SpaceshipExitRail(), ), ); diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 97be7f3e..2fe23925 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -20,6 +20,10 @@ class $AssetsImagesComponentsGen { /// File path: assets/images/components/background.png AssetGenImage get background => const AssetGenImage('assets/images/components/background.png'); + + /// File path: assets/images/components/spaceship-drop-tube.png + AssetGenImage get spaceshipDropTube => + const AssetGenImage('assets/images/components/spaceship-drop-tube.png'); } class Assets { diff --git a/packages/geometry/test/src/geometry_test.dart b/packages/geometry/test/src/geometry_test.dart index e702f043..eb5e8d74 100644 --- a/packages/geometry/test/src/geometry_test.dart +++ b/packages/geometry/test/src/geometry_test.dart @@ -114,9 +114,9 @@ void main() { Vector2(0, 0), Vector2(10, 10), ], - step: 0.001, + step: 0.02, ); - expect(points.length, 1000); + expect(points.length, 50); }); }); diff --git a/packages/pinball_components/lib/src/components/spaceship.dart b/packages/pinball_components/lib/src/components/spaceship.dart index 4d84eb68..59f1037a 100644 --- a/packages/pinball_components/lib/src/components/spaceship.dart +++ b/packages/pinball_components/lib/src/components/spaceship.dart @@ -195,8 +195,8 @@ class SpaceshipHole extends RampOpening { @override Shape get shape { return ArcShape( - center: Vector2(0, 4.2), - arcRadius: 6, + center: Vector2(0, 3.2), + arcRadius: 5, angle: 1, rotation: 60 * pi / 180, ); diff --git a/test/game/components/spaceship_exit_rail_test.dart b/test/game/components/spaceship_exit_rail_test.dart index 99afc808..edd81aab 100644 --- a/test/game/components/spaceship_exit_rail_test.dart +++ b/test/game/components/spaceship_exit_rail_test.dart @@ -31,29 +31,33 @@ void main() { when(() => fixture.filterData).thenReturn(filterData); }); + // TODO(alestiago): Make ContactCallback private and use `beginContact` + // instead. group('SpaceshipExitHoleBallContactCallback', () { - test('changes the ball priority on contact', () { + setUp(() { + when(() => ball.priority).thenReturn(1); when(() => exitRailEnd.outsideLayer).thenReturn(Layer.board); + when(() => exitRailEnd.outsidePriority).thenReturn(0); + }); + test('changes the ball priority on contact', () { SpaceshipExitRailEndBallContactCallback().begin( exitRailEnd, ball, MockContact(), ); - verify(() => ball.priority = 1).called(1); + verify(() => ball.sendTo(exitRailEnd.outsidePriority)).called(1); }); - test('reorders the game children', () { - when(() => exitRailEnd.outsideLayer).thenReturn(Layer.board); - + test('changes the ball layer on contact', () { SpaceshipExitRailEndBallContactCallback().begin( exitRailEnd, ball, MockContact(), ); - verify(game.reorderChildren).called(1); + verify(() => ball.layer = exitRailEnd.outsideLayer).called(1); }); }); }); From 5e2ab9bf7ba70a3fe631eed540eb0678eee9a8bd Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Fri, 1 Apr 2022 16:33:00 +0100 Subject: [PATCH 5/7] refactor: renamed flipper_controller.dart to controlled_flipper.dart (#128) * refactor: renamed files * refactor: renamed barrel file export --- lib/game/components/components.dart | 2 +- .../{flipper_controller.dart => controlled_flipper.dart} | 0 ...lipper_controller_test.dart => controlled_flipper_test.dart} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename lib/game/components/{flipper_controller.dart => controlled_flipper.dart} (100%) rename test/game/components/{flipper_controller_test.dart => controlled_flipper_test.dart} (100%) diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index e19c607c..591f6cdb 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -2,7 +2,7 @@ export 'board.dart'; export 'bonus_word.dart'; export 'chrome_dino.dart'; export 'controlled_ball.dart'; -export 'flipper_controller.dart'; +export 'controlled_flipper.dart'; export 'flutter_forest.dart'; export 'jetpack_ramp.dart'; export 'kicker.dart'; diff --git a/lib/game/components/flipper_controller.dart b/lib/game/components/controlled_flipper.dart similarity index 100% rename from lib/game/components/flipper_controller.dart rename to lib/game/components/controlled_flipper.dart diff --git a/test/game/components/flipper_controller_test.dart b/test/game/components/controlled_flipper_test.dart similarity index 100% rename from test/game/components/flipper_controller_test.dart rename to test/game/components/controlled_flipper_test.dart From 21cc04facc8736202c2b6d3bc732067dc4df7048 Mon Sep 17 00:00:00 2001 From: Rui Miguel Alonso Date: Fri, 1 Apr 2022 18:03:09 +0200 Subject: [PATCH 6/7] feat: spaceship entrance ramp (#126) * feat: added spaceship entrance ramp assets * refactor: modified ramp to fit on curves * fix: fixed priorities and positions on ramp * refactor: placed jetpack ramp * fix: modified rampopening for priority changes * fix: launcher ramp ball priority * fix: fixed positions and priority * chore: removed unused import * refactor: priority on jetpack ramp * refactor: removed position and changed sprite load method --- .../components/spaceship_railing_bg.png | Bin 0 -> 22626 bytes .../components/spaceship_railing_fg.png | Bin 0 -> 16318 bytes assets/images/components/spaceship_ramp.png | Bin 0 -> 22068 bytes lib/game/components/jetpack_ramp.dart | 226 +++++++++++++++--- lib/game/components/launcher_ramp.dart | 1 + lib/game/components/spaceship_exit_rail.dart | 1 + lib/game/game_assets.dart | 3 + lib/game/pinball_game.dart | 4 +- lib/gen/assets.gen.dart | 12 + .../lib/src/components/spaceship.dart | 3 +- 10 files changed, 210 insertions(+), 40 deletions(-) create mode 100644 assets/images/components/spaceship_railing_bg.png create mode 100644 assets/images/components/spaceship_railing_fg.png create mode 100644 assets/images/components/spaceship_ramp.png diff --git a/assets/images/components/spaceship_railing_bg.png b/assets/images/components/spaceship_railing_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..2298f799d76571ceb07709190aa8fcebd0802fc9 GIT binary patch literal 22626 zcmXtg30#cb`~E~~v}h2e(k6toP+FvvvPX+8Z3u}rY2T)|l~zSXS`-OUlq78`DpDat zY11ZY(LOcJ{IBEt`=8J2eZSu{&pgjL_qp!tzV7QhR}2sA;^z_Jp-?FNdv@y?Qz#sC z{IQ~P;V1Wgy*I*t7CP-Vy+on#E+v0BD2YkJ6pAEekDksUkLEwE?n#Hfv}%uB8Y;Pz zS&*Fky>0fBsSs^BC#R@|euf^u(oUI=-5h2q-AYQmS2!bQOs)wpm5G*;-g{+91~owE zTZa6fPtT`H8(Wgi>W2k-V`Kb{-MHNtrB(`7YL#+%mxhxY)Ta&w;WmCaDT>YeFf3#$ z?8?DcsmK$oE5&|rXnov6#rQL(5lW@s$~;+@0wk&BRG%9(9iCM|G$TR%B^>pF{v+HS zn{-!NNAxSI7rSaC*Pq^W^ZnVp@A&5@hTWE1b?1~tTu&Zu zv6Nomx>V_)+q`G!-D9H{8ra`!`Wn3J3i;Ls?Z&;O z%kntubdE864rDfdZ^3A7ZQUreXeEaINw=cbp$V@N+{ucm~v8hCuR;m z*TPqCQODSfu@!^-clGMkZ!kCGc(@0L9tww~DOI%}+m|5Ie?dol#i!AB6Tyl6rlq z(T(x#+p(;++f5rxGmIB8!oO6kx-`UWE)WaoRE*nvm}R1o^LFRemI0-zpmf==K2M_z zW81EuKbOdcRV)gv>~Ya3>M7Vkl?qFj)fcW*GEZ z^`@D2B(ZPG8+Pn=)(#}M?ds~PLT)?gFb3}V%f$HjI9Fh~zq#bAIBrR%&gV)jD+!y8 zSX0d0rPr4iui6)oB}hNg6dsH|;8u6)O|- z)VlhB_r#Z@?VE)89;#gUYUeSS-;}b9Q%aD*I2M2A%lUkbbWxqh_^-3Xj_HHRh>OJi zYx3&O=9wb)zT0gXaM371tZj(fo1vR_LN@Fa=E<4kB5S4IX^x9&y5+-DvqdjozI=!g zmEzj{{^sVxB$_O9nl?S1>9=_(hK#I&?_cxw|IjJI0n< z8xLfCIWHV?vOCP*Txl6+r}?!#dNr%|#Og(L>HfF<)v$|(1-T~nK;0llGKPhP1^Huv zB^z?lScz#6rE<;_t6s1`ho)yF*z+p9SoFp9hS=-Z53LP5wL8u5zOqPU?wvb#wh8mi zDCBp97q={I=lTF_a9)?zG%$e}wtIT)RHcRRUosXhTzExaUte{tjLd7Ppv$shQi=B- zT;9qf_We(g(mg?*1s9Y>OtJsoy?y((WUPMcFcwIssMR3{L)(uz{kJkyKtk){&(~La zdwb6&)b{*TiwdluY@ZIyde|z;$F*bU&Ye{+E_PKJq-c7M-Z#3l^G$Vib=INvh_3PA z^CK}To<@Ri3}ppJ89rJ%v?t{!o}7sI7`1Y%TaHy3OToavfS=5Qd_ryi)a?Au<921w zFU|UB2>^5uo@>@r-Nt9jPmIL+O-e6_r11o+0fLHlUlZ1ERL=N#&ZUe|=g4~I)LG$u z{P^(~hzsTc8t1M97-unzjg8aaoO=2T6I+}6$Xr&h&D2CtACLTa=bevh)~?OGjuE6Q z)i&r>gwG#8h=(}UUg|r$ci+B!0~kG9=f6nj2-2RedSzo8pMOj)z5?UQ$psh$#t0ra z9q3_8@34xMxzgv^*7etepizC2`la4)BxZ5N^o)#*)!N$hA7c&LW$WeT4;W#+3p~eq zBhw5ohfns6GknCOx&o-H0MX-s;r_oKGd(30XKu*ui4~@DG7*CHihRcF;}B=7Lfwbk zN=!>Hd>EMEx>a{}AD;AWeSLjAZ}78c&s^}6M!-5YdSRB%ki!YnBewa+?Sb`M04p(L zeGRGYxH~gbQ`175hLmmWnWi$9YcFCQ;U`56pv*0xR7glhC>@a%3=6`*6GSCzxc>f3 z{)fTAg9n@XUAz+Sl^rQcFk33KM;b`nxrVyS#KdIB84OQP#>aOU_wL=>3DECQi(0C0 zq(_yCKf@n%l~$=}r>h$5?&g&SARw1 z&iPV7K@~q73X1ac^Lu`MytAwO$^~HMvZYI{-{LDoluo^_!B2&j2?`3ztXZ>W1s_+5 zX0+7k^<25E{kwPXCV!G}>xU4u53{qg+lnxAt@xJ~3G1PuA&00gHCZYph|M2z&$bzJ zAA(5tA(N4LFjZ?Ckj(@j*K?qG?80=c%pN2`f>mn|B&l8e^&u^=2LlLcqk#m{tu!FS zD+mPZ@YM2G`r2Z*CEWPIA*mA9|@Ba6cG{mT{itQ+yWtByXofs2M-?D?g(A9@*l>y{Q7VbiPm<_wYQIuE0qlz zoh5h;8u#ztA93c#i;M9jr|**R9sh`_zn6<)QRFtLflsAj-}VBKg95N=1%4hc1#;V* zK7D%stu6M=k4*Eh(R{JlU>+*tBaNlD4vtN-So87`S>vmz;(Y$k2(vfKCX-=FTiloaFg0Cg5$N6ku%%=y<5?iOVw!Vt5LFtR&s|Ndo&f&b>=b>XC&9|k z6TcUhWxt+U;8{eKsyV%B#k1p&Cy$E>=+HPb8*SGHT^*58-f<{4^=i#XCO=nTOuFpv zy}NpA40e{BjKjF4>ezM~0F5kI2u88gv9KrpEm_2~`Nyq$RH7>8792xRhK9+Uyt6A>{5v-3Bpzir>+$2q7YofDbZFCB=N%TlXm#M0;ZeNR@h>D`$;B6T0Bne*uYSV^}(Vg8UjXwzkN^zO!OXvwf*s$E*Kx3)=l=qY-}n zT~(1qo}=AwO~NpMuEwVEhim#$(q-SBQ%>Bwckdd4?0<64)W*McpHC10_g12Kii&5s zdM{aOM~I--$gBChWJ$In3mSm($t!DA4@}HF%*x7oZr}2JFt0&tcKq`LleJ{;Ygb(f zz3`xwDwTdD>o9`NXJb^1Y*=io!*HC;l@H1Wx9WOt)Y|$LCOS=em53V&E(l9M1Za1% zw6V9MANUAZkCM>#dxYu!=}4b#VfTPlmHn*}y|6PvSV@k_*a1Y*X;cnY+R0b>#Maif zUqEZRBXF#@u4onk6F1tr9T_UJeR!&}6>(KouWN+_kE!0~^)X#Pe5e>1bLo;LOL{(P z#3UC4(O!=gPc!;bhs{g8CQ=uPsTno{G2UPrQ_Jpvak#s?XUgoke8yDY&hC+lri=2! zle*NHN~=@CAz_43d>!tbn)St;+->Z?ig-`bPJAda>?VVhNAmF{jbyi!J|lho;4umI zbaj?$tBc7=@Wwsn=H^MdX@)`cAhLMaJ)TSh)z(8y#FTa^c1Y`mrfduB;N!os9Sx}z zD*M7^EE!OtDpFL{;qT8k;f^H}U(Jvx2APYu0_?z`JDt>Yu`w-C8JHn5|NgC(aEzDP z6Jbnw+o_<$x1+`G`HKsJtk<1R-vAoRc!DeJwwPt#8=Tuz*)G8o>=B{#wck}EA+%69cr#z__6q9+HB_7;4tQG*!j|>v7wg(*()~N)F;KIrl#gJ_CFi7SXikThNS%Y zO}LOk=|FbTP%}wA?(M!)t)D)9G6uc`>mo<#72b1H6y`IzxBup7>#*Nc5q8^ZfTN)0 zvdy_63NF|)4kVGkbRB3rXkf6>>-U39OGS}L7hPRlO)!h&8#rjXyFtrs)Ld>lO`A~D z?knhbIH`HzS>pDt7A06AKKOZfuo*ztFy;f&|4iiZn)G`smtlI!Pbh9T5(J`07(X}- zSR5w#3EMa-$FgKbp{qJtLff&e*t@<=^p&s)Sn?!mcDRh*{LHq|?GISN#P2Uz0%B@T z6dn#Lowfimco;l#oGh1LU$T1}L4WG1h?>IZKCclxs0NC$qYi$3Y*vt+n>*?OUcCS2 zCjD^Q&&9g?ot>SRR4VR&rZGm9x?5CKWJ2TQuzqwoJUrZ5IApoL(!=B{L9|m~+Q_#; zZBxN>@pYCneAO4rw@cEt|N0{qcrH|1N{>fjhtBoAs~;Obs5fw0%BgeC(b2I5;2DDN z^jp);|Ne%O^;sPqo&UhA-)1FNRaG6A@aXuD`yN5x*~!5cvOwcdPe){@e zT@gaKiDmBTx3L7WcOzYCHWjZ*e%yaatojQIBZszP&&E&*zZazsAO6Nond?Osn9zbG ztBx&|kdSD|eYDBr0dLE=!KHl)sH#vVnms-uiU_G`S2%tkRm*oY?x>~bIu#WaSFmx3 zznT(ZRkQB~#7;)UAkF2;WkopGrE<>W(AGEFonid(eExCQv@w^q)>o-mBCFhUAJg9~ zMM4)&5eitWdmXjIM)Ma=o#XwDjxE5Vum7Tspm%^S#a|069(VQX)sfdr4{91=EC%@- z^_onVU7|y~T;26IAuev^@lqd#2`MdwvW(82KHVK37pLN>DegSdQ64ruJsot;FP_O{ zN};NHELI((P&$2zjtt&&eC5%^d$yh>>E}u^fzf`WZ`ZcW`IR}1|N8haA|m3^Ilr^P zx@pscz_7&jVWC@ziOjsSbuZb*TG~~@xAw0YBbfnn$+(u1BF^0~hALD~P@i#JaI1!f z##fT%N&dt0iIkR5%sC>IwunSl6%Cip4iTC_%Jx06^}(gGVKS(=0O3a%cu1xi=2fNm z(Ww4+yXVsl*ts`a2G`(6b$C9;N9KM~TM!1h2v6vM7%1AfeBYl)mjkwm_c9TmgKvba zn03f-v)fPS?YrKV%6OyT_qWWi%nGTSw~fx8YcENv5U`G@JA3JUvFF$jqx;%HEtEyB ze>D}}F7P*}g3&%J9{;pY;S9L^&I@`=DS-jNxd@VDn)5F-H3Q#Wz7}=}1nZvKv17;B zySNQUd;0o>e9V5;qLA;b6wqe==y8sjoSbYUCCX*D#xFq&m#&%X;MP8N99zz36<1*K zn={J8YSKf}{Wd9{y=9p84X{WLAlk%7PW(74VNBCU0Uxp4((>{*DmduD@}bp-dKmP38-)xJbNsp4Y?cEmsl2l!!$hyr9nq&JUG6{0jnHDPUbsxFcxXo#YLz4hkAQLbdtqrcD9T6RU@I`ZC^Qvgg(MoWhs||fi zEj>De6V4@ud_1oDA^-V_@_;uE1zW*X-mn>|Y}4-veW~fP>!Ber3j0!KZJ|?G$OyJi ziT>Zed42#<+WTv_j4D}I?Z2OuH83$d*PY5{_C=lBXv>!^(3p9!3|ICB^_gzIkW({opj^Ijb}*Xb7Iwtb!gOvvA&RyQO$+~jCKN1V0QdTH~(9h$S*&(Z!vI_-9`Ap zzIZv)Q%{e{QKjVeERhb9MC!D+wY|8R?;1^1v{q*A+O-osB5I35@2u6V-CPB1R6%{x z_ML~%4^x|O<;UnrIFhAO`smT0ELL-IFiqDSG~ahQ&?2_{M2Cw;GL)tLjmn#Srbjv* zOBublR)JLg{c7e|@};eCfFI z?%DkyER3hV)9G?f$z=2JDpkwE;|S!1R=yKol*-xGp@Pfxo^og!?Wwi;hE#tbx_aqlJ02d+dH-!Rdv3RaENQ=Re(Qz}8@3(DG--ZvvNFE(hs_bx zEJq(7pQ!3@%oHWWkRP{q(aCK)-7xFRZ|pF?Urrh|<$>JE)>RQV6R}LwpG^*KGebGt zFjg$AzGE6ZHdEZ|S6V2hYf+TAu(DM^Ft3pOBRpE{TD#zu$qbZh@yj+G(X>a+5=b)Zq75~w&xN#=EtIrWpxVBr}J6{<8jwMCYcA4*RfYt31>pp zD4T4)z|P6ctX^DrfL49+2VwvF6P0a^pB>d&(D5)>Vd$AQ>u)suy1Q0vP2raM55O)h z39>M}{H~jC?pKnaGyg(N);Vrw<{cIuUR}O;!F+z~vw@s4R(#Vy-0$DNneJ_#ecSrV zb|QWgACo{b#v%pXS;)m1mVQ5G)vhQeU|PFJEh_xaH&;O3m#m{X zZ)<95ioe-E#>Qkb8t9ge1ud%~5#QS8J!!7?@WkzfInpy*q4RA~R_5%jPcG`vZ7N2d z!K9|09{BngsaRXcQwSk%f!mrHK;B#UfsZqLwnIV{6(*sjI<(i9*9{rl*w{2cqc#Cpu2;~q(u?`GI@N#O-xIe_3WqSh_zIv$b7FvY~*L z+$*IjHSkzcin1)+-3u&eL6pNRZO;Qm;|j0=1X(KYU5I8x61n zp~y$F8*x`Sqsyyr^!W~U$Q=T!O#{oUy!tZ|PEy5$FSm!XS;K6C=@GmZM8P z0Y6hxQcArheygCyl_=crf@dE@$s@EQm}+hU5_hr5!o3w5*8`In>uL3mTgEm z@8~#uJwYQu=8BrdfhLfFmiA`5Euv!fG!?npTq5~dfsP27b|L?!)!kC1$KJYi%UfmD zQpiX%K!&*;moDY`vRQMXqZpm{1OKZ6rRl4?rlCLOXIAK1&DKz-mNf{~>Tt^3w+%{8+cLaE)cGN*>~y-_I0=+K<7NM3aNAb!dVCl+sjKF5lVRs6|BFxWr0J+eoNUPEEC!n`O_&SFQ+c8+F3Zb-OEH8ELj}40ME#_UjAZ!0c{V+F7 zw9yzeEnU^bR-#UB>>nrH5vO$&nhGkV#n$_ULv(n819no=h=58ef&PP9C`d*+_zD-E zn{1%7#!^uT@QP_r+2MO3gnM@e3t3Vf#s8z})}Z2T_Zh2GZ9@(G1+5$O^KK)(F0|f% zEdFrD-Mg)=cKPpGA2uWM4dzq#yA}T7H;y2U33}ofIv=9ZmH5?Vi__b7K zcQxoj;yEcM`x=zlZFA#|4J55DfjA+>iR#FXl+7So6Cn+KV^Tp^LBcOxy0lVCFWvTd z493FBZ5)@y(LmCrrrC->uMwhP`S=fN&yAZ9F-OF2<)?GX%_uMCoZf=#0}6PeB!k%M zpcM@4TkT?$#`=hSspvoIkXFmBQ0FO3q7hh=6DPCB4)WDfJ)PUKVej6*e;?HPoO0Qr zPQp3@9ko9C6sEVdv~-A&jOS=cl*#N_qDzIK-$<0bKPdEi%cqvz9(laVm*DOfs2lq$ z^o(R6^G`HFPH;;*K8Ip8^YhoQ8W!?GMAURZiVs+|aJ%67B%3K7kN5p9&Op`*f_`Nm z+^<7}g=8#F2Rq;ExsJLg_HH5uXu`ozhPtX+gpxRfa7E8LarJ3$Z|{|)(D@W@zart* zEi)%T(%H<$JwzoG`8vrV>D9?D8TK8Xb)MFq{gbC)D5!7s=#(l5k|{`WWX#rpmFiK7 zSI7Rp7r?oDH_4LYUo75u3jdOLg;bP+U}mpC8&@_$X-$x1RM!jkY#DoY00k?%YD|-! zmP&NIqSiJ8styFJ(?9|zb;<`eRZ0)ajg($Ro!0o9P3D677m2LmH<4vEmy10DFrevr zkXGxFZ1ciRnos8Q_=|329$p`JzW-CkK4@s_f#|l=0yuSO?t{(wV?-JGj&_v%WFC~C zrjH*#hA8a>14;l*r6$a$e3S~+uDTJV8d7%7KU6pE0~p4WA(9W0p=Ho?X;n88)zJ4N zD_<5eJjCxY;8DHO{l`bBHfs)cBNR2<{v3M)ozbPS;0qUY`l9n+9;%8h3jO6)R7fI= zx|4~=QmlIM;)MqRfyv>Pf*faLz^Pzfe@AHh`^#oqhb=)FI0_faBAvB+4LmLYmMxC@ z!!HeW*dEGdQI8w6iQQPYCQ^eJU5}Ck&#M;q{&NNN=5}ol&m3@!y}(5hP>rq#R^u;H z^g5p4pRr9}!%$@&gTgV3WSfu>;8tj!y*AZnbkDIn16;R(a!A$YZ!e0icISo;ps6$X$(#rr!T zK;u7XcvO;f5c26r#W9r{NYZAGWuQa~8Lc#m;>bs3gNEd-?w06!6#ZZ|jA@pkTi}Y$ z9@nmOS3mZjpdtm$uL(ibJo^Ydq##5%cTxRCqu-pmGB-Wo2^C3orlE*pTUj zYeG0khx{K{_V7bDmI;ug6}5_+Lm`~%o zSO3d0YVL?vLmjaboehe7o5`1wXOUGMbP^LH!n8aBr&72Jg_9s=GuUL|t4NF4Oj(|Z z$w}$V#&zy2Y3y*KJ*S9lI$c9MCoaCdGZjla`^`Ff8_BbspOUVFfRM5xi|I!f(51eC zwtBO!S6D5M^5a8iv}~9(Rmv7n;En#ENcXbsycnrS8=0^+tcdyya|^nPjB)|Lk-*~O zVoioRR@o05sqNAI`)a)|8e7jL?u2~<$|WUhhJ&I)M~_DxGIVE?rT3r;T9KHuu=HQw z35|mISrI-s%+X0tekI%$iviu5?T2=`yw5(K*pI6pOXWACP5>pEG zgx%2ZqOm}y14;1$RSI9G_>-G*pRqJ7{ePAl@Br&C4-c1Z^PL&*cN!BQna2mQks911 zk=;0ABOF2!&d^P`5V|iX7wUr1&9$UKybZ2qgilONeCaf}{or4mBqL51(Ib@7ZAF5G zCS^!N_wTz6ImLf)o1RW1-r}3gNuh}qj@#-<+I2^AEa!yKvLC(T zfK=G0Ccm9pjv%!aiR1$4In58%)}R@2GgW8)v=6Lj5~96a?%0#<4izyndx%_`O{6!8 zbWK+UWKa#l+`(PY1UmUzfTHTgvW_sCF3b7yi_|AjJ@P-{OL~d|3CFg=<9`zMoM;$W z!-RikbZa}K-hC6anab7bsC6c_=lTyiZWUWp&B&RWohwC)awjI>!J*&Jo+%6eo&PG* zY)tzoC8_LYf^67N5Y?G}B9H-8z-QOR?d{niux;EBu>CeNQMAcmT4?$53>grHadA1ujA|Lh}5Ue6Chb*wi$M_g0>p_ zixhvB31qipmX?0zmb1_)PZG@&jF}_qfZ)D?E5I<)J--&HjY^(${v^<{=8B?GZs#cR zRr(+V>7RR?J-g?hwv&{0ZI@_(U-m@1bM3|g7mOPFIrQ8ANl_+n;i;ja!g`+yfVl!*YT!JW+NCy> zkznbya5OXZ!I$$BEy#UtryrMrjJv`1a;M`Lg)(!Ch*3X<%BIht0~QiWj|CSYdgH{A zUygrvLHiL~*5=e{{+LZ#`3sht&!gz=L%G=8R^nZ@gi|M0)vq1${Bq!b@SR2h>^&kY z2zjRTt=c*LECPa|oEWmeGmySk#OD~AY2H1(64-*K$WKd-ttpi_4TUEav?xf786dfv zl&VboE}-h|oc;-~xvgkyCK$@f?2dKG9#e&K;A<%4^U-fd;=P+hjjTb-AU2gZC*Pp* zk2$^v73Hu5Yb3N?6@J7edbBFxXkkeAq$n!alJb>>*mn_RV7BMEpON5|rh(PS0vn<+ zLRWE8E^moH6IV9#CCBo*4Qq++ZerFWKD_O9WeRN(>GvT#9$2}>?wcY*-AFK|v0o2Y z+miK#rzMMnk{;E^FoXwaMfF7~Mj;wZ5k!oQDc9&!e%R>j;Qx@Ph5mPO5tI=FK+Zdk~G>xhjag%ov&~NjI#Tz+=$V z=Sai(wQ#tg{zvqiJW)(Lt(Zqi7Z0)7kn*kHMcT7#JD4E$oI%mx^A-nDyJd~{eQyA( z-xHyCIfDX;+z~fZiC8E!iM>nHrP_eIRenBCd8NWbf3L{5M1L^@oiA}8=pB*&+7f~G z+xH%-NWEt}gDVyhqw3KjlXjfe13(2qCQL<86}(DvuiLly0?x!Pa{hMzHwrv(75aT^)LU5TeeTD!w-9f8J) z9C7QBN6gl*L!$#4AIZ`mNrS$_({lSSySxeH5T+AgeNzxSBjKLMXTX4TbuHIC4t6hu z9d8(Ss=F?_ySO|%LHeIxGcq$PcmBbw8;=PT9Fhc8nX5&YqYrzRt8h}An1fKI-%>p` zvwC(L!F6Y%;DCS|4e8`SZfb#9s*EZX)b-+oudi=@@nUZ%6XFrm92E1wMD5^)=W~)l zS6zUkCO|{0>M>1;`b}TlOUIIj`Qn@DWubP^C_jOScx8$G0+l0ig2q5w6ipYV6%c0| zs+6?8k&AmawCAsOW=&JH(?WXgsm zl0=XGpfW=pX5??!*K48T2hntcXvSt{W_1_MX;MLrjg6a6@b1EbKV+ox(t~Kwj31bm z`OR^6F1y_Dg=K;}lw_9u2ZtRY*V)MU!MA+ivICUB{rG|@qDzG<#CFuHL_Ua?``zv@ zVI@wF&$Fmf@cQE0@SXo|6mWW>r-^vcevs6*XuMhbODcCR9I;Q3fsSdV!#)NA^tKv3 zlx2+OsHiC7)M00l6hd5mSUUlEeaiOh7g)klK|P6On)PL1Ms8@F4D3jwMSu9N-?3c5 zvRExwf4&|OY=lU+tcKqVn*75tFmZ)LhHxi-0|g8K6A%_2oKLyz_LvSqWV5J<$jiiA zw_3FsZx5zKiZ#M(k!odX>ba?SKyD$Zp$$m3>9LrOd5?}{xx!uO-IH<4GexK!b&WQ# zQU##+YJ&LrhF)|oEp&)_>tO1* z^5+Ffl^PI1PkwvMOK~cRHCrz~PRz-!P~^R>#2?h;%6SvhK?2+&oV)({$tP*GXv2ZEMv^LzeX%6be@^ zVIPb?sM3}-M9u1f7ZeZ$MwQw98Fn5Mo&J}OcQWvq`4LJfNJV!MCW{IO z%L)n#rlPhEy|9+-F;D%<>{%lLCvbc!3Cyh?Ba+JGBMWq?>l75UUlQ*p=01o9tiOkJ zvr%OCK#r>_Y}aTZo~#BxyhmSbbgPL;8JAJ_IcFDB;q&tyLjAkl=hU+qkV z%p#)xZmqfWaccmWQz5>>WRMQujn&)7B0;p%xPz&7I(z>7GrPT0gWR~zANxX0T%UICHh`|T@b6seeB=z#y zbBE!s|5Lw!B76uN(QW7l!xIT`1*4ESdPyT#jJi*2+*A^p-9CI}%#RkxEop{SqZ{dC zV`IE0Cbm*uov=nvhUg5V%k!cAC6iAf-bD{OgOPeFM%(jbMLQMK@^FYN^K6x ziK{`{JEhj;JZ?PkVA2X0~#uM(*Wd#W`XLLsr`9mI}*xGqc=J>6TN$^3af z9OR?$Wh~IyE>@kqfkNz}#Dr%C{Nl2owvPBqxWj8?WGR>DCGA*>(wW~`C1@*UF4l#; zC=9s5{O`q|brg!Z@^;*VZ6dU-vi9h1zSF`XH;IN1L3mn6ltmQ%lXwc}P;8ErClbAn zu4Ivx-3p9RYv9fQ8g@b0xoc1>zxrQ!1)KE0n=+a<8UH@M3uLtg9iUwh>g0v^$dans zp(PY3j{_fS+8EAzxRH0%P>tH^Qi(Ov_T0Jq%j#oKJkq9|P)w8M!7T+BZGHo2zQesp zO!nGQr6^eZZW8H!;Az*?LqapWVDP!KD#7I(6jeJou5erfcjN_9n#!(o^cxE&ond0W z-}}NGtAD>Y8dKjB%%5~1^AfqI`TuP<9GXtn@|}V6d%1hb+|bed?f`^Uw1~?2>zZMq zG-={2^UxHBuy7?^7LV+QuG;hHntkmYlvk2Gz}p8-)BAAJhxGeXs;a8EJd@~T(~-i` zuKC%639omrvK}(vySjkvAH}@U=gA@o3#_@PuVSm$9vTyyH>67q5S9HEhMeC60~fFm znLxn7aD~!uaFqsq_`aeHhNVQ6bBQHNRUV}Ds=T#=24N41(o~&lyU%9xB@}P%#l=<-dA za0Lq=A0H+$@Ha%w$iU6S38nC9b#|r_`zSN~iCk?IteY-+-rDNu_t|0r{Y?ZYFJd6q zOcJ}`t$!LlsYu}hx3N5E&B{?@LT4$w{p9v`%bZ;_&NS?U-8jEf{(zhEqsAkpuK=Fa z{DOj}15_PhYjaHYb!1oVj!JEiR&}M$b^}eIfT5+OrF>XAHB+48bZ0ARH4=sq!(DU? z-Xd63{AMR|pMF^u3^y0ysBa4tgJ_?LQ6GahQ;b5Pjl#-9fj1%)-v}W7pqq; z4}Y`iL?zVnerfss;KpTuek%%l!mCgc31z9){m5P?aibB&O_`s^FtJl8j z=fdR!%1<~!2TgrjyUkEp|6ie3GmysrVk8>Y!*En734vCE`mb{zX+bC8bsLz6&j6}X z1HD7H-)yli9FE|!&ct;;Ps+t0Z#1_OxVw4NrcJ0+JB$0i!zouW;Mz5hLV2;Ad<5=7 z!!zW00_XSne-)R#S9q?#saxo-6CxYC5SZ5p`RCUgPiEvaK9&h zcVlz&A1bXs|K?U&0rz+SnX9I{_yq>5v3*USm_MDVmc`#Gdv zf}j3MYvgLzgXQtuZp2Np3}R*ai95e1SV5^u7EXD0;soH<1CC!ry?ea-9w#}fKzuaf zL05@e0BXQ}L)l|$trW`0M6-6oSileSY~(27=J0y_b*AvqNG2>(Ser2BnU?0}46z3ET8*Iui!N%EWY}hi zKyn@X7|)3KuG}PmM|MPKKv~}encPTlF(fBJo;Tf?avTIQ_{@8!*7G89P~+0I(P-U0 zNlQ!nh|^$}o;`7K%a$#xCTAa};L_V=`DPJ?^6Gmc`X)TXe}ZWmTQ8r5`Kc1E;%hiE z;yd$_54s{?^1xT5-k|zLV=hIlDM;gPy3~Kg98B}pGJFSAC={PWSZ>1&RRrL%vY@Avci)^G6${Z<3UuE4K^zqSbMHMt-hYLe&E=+ zW*Q&)o96j@lix)R(n~mHAn^&Z$PoG}PRB9vW*1n>=o?lELv8?dnkU5xmtiFIhzPI_ z%Y@E`T)A6V0}-W9p~}k2pV11UB^|+1pM}Z!7wqWZ6#ty;=+nuuEr^_Q6`gdwe8rca zh47S*>&}Mn`1ONJo`|}E!j_+KVD{A;;z0UF`g51jfmy$CV{6f=H(~5|H8s0;QBOik zxJ9Z1R9r)XoH{SE{r*CjeT1^q3wC&!E7Lw&Y|`urluD*hoNN^_+uq$VyTt#_>xl z#Uaa2_4p`G_nAENOTcVhiHwYlYx-R+d-#? zjs+?{6O1HVCM` zc<&yn4m{BPZbcSOJeb~5m|qWiI9fsGhI!DL@V9i8?y=YkVpb%a)p?+bltIG13n`SN zJE6r9NrxnE@ljK(x?o{gg^BwWXw_)+KIhq)-&U5w|-|CH=fxygmx6M*OjM%10Q*cU3>2F*IhA3YPy3 zd{I!%7f*NwMNk=O%t}(Fb#0p1E66#&nsSvUWhP9UI@vu-b+6)-f{|h~mfT#p4;$#{ zPE;#cqR%K05cMz45_b$#jlq{xHmc1VH52z1N>NumLMbKe^>{Lslj8p$%6w9rN+)w*)Yb+`f(_hqc=_N(nfuhsKUmyV|IQAh4!(fp zUh=;WfPfMU6IAVuHV*iv?Bc7vD!incBlNn^`smO|hOG!WF9(~I%gj8=tHbBWu(efh z8gfJ_gS+*_B;lxoG`Xi@|Ft;rp%{_=FSU( zAu$rDW_^f-&sj`pJGB!vBj25m)Xlz#J)Xt7yWyI!mlgcEcxGxz!<>2>+pMx3auyDJ z%clqZtbO-xFKG09>xf53HvD^}FTrd&lTHLG%s^TGEd9cCHF^94D!pp*PCy_NShebe zt?zz0?@EI2Lq9K;pX*;^XTzQ)tE2B7!s=kI`|q*NPi2<&2vvZEEKx7t0Io%H&jB14 z)D_g%iIu@QC<7V`0oMbib%Bmr!X2RSzgfwz7Z|helmPCnP0$RYbz^s8^;tN5$}I13 zE<_J`4o4x{yD!!U7PwQBY|0=#Pfkk!;CI#fXz@wotsv!GBuxWoVPNjb9Tqn5DsYcvpX2-9fpY0fa3?vS!~9vF$e ztOv`BM%r^crmr|lu1YvO{jzj3>*C3iC(|In?o?p{r8S&4pWJi(F1hlzG7x~7c<4?w zof0dazCCHgPsa+Y2=j9>p2~*lLZ2220{DC$-K4~S8 z$*vkv6^UGv|GV9KKlG(`C}sSeG%cAr8v+cH+JT%2q-V(RczM9XZW}PfAUZbHv$r7Ndno zkx@YG!w|7XtkJ!l2T5!}CeU$)TS||dHQj?6D1NIiSjFa9ub2WyK05eUWK!$EUyowE zfj}S=%Q|zA6zI@4vY6k{eL%UKoBpr*#u_bGFKX&>RtLt?4q$c0C2#^%1B`Y>A^k9< zoDkgFGljL@zSh$?sCl8AQvuV%7pyCmBtoJ5(#8!#rMPIGV)6znM$FB=>fZ;_Ndwp# z>Eg-pwG@h8g3KOc5cM-Sg7j{X<%t2B+&)Z_sc2!KkS>*A)nxVl&4lOeq)L&N(W20< zAHUw==XX&m2l)xmp}0bSv1&|W><+QgXMpTvlP{Wt!;IX(W z%WS5W=w98M@d>Nkx7~z>XH!6Tdn+kI3mcEVT^~ngx$S6jsnFam5KR_yKnZVXS=!P+CmM$((TmBG8ll;AV?kc zlh?vnx9-8g84HEuV+D{X$8NcU_Fw})$4s35_Z4O6MS2lCR8PJ#ISdL$TcGgo1JMYS zNIv?WSTsj~%)X#j@&w1WvtdIoCG1t&2B(X^6MeY!mwU;HX`JuIf&YD{b2e28Ka~r| zLC{k*AS`KwIL{z-!c>G(iBx0!eQwqd@0 zNd(cH2`@ttC)qGw2iMCzkh-sK}l5%4*KtsC}qPyg-eLC{Aj?IhE{`ew2OoT*7Y`M^;a%c7abu%_gM zX!i5=iGWU=j*jcA8(NKL)gWOJq_h+Jm^Zl;wMYI||4VEI_ZiE<{Z_rFIwcCdl4SM} zBDSjPSPaTgG%;s-GIl~?9G6JEw+?O7#nJsJnC9W-A)fP&r3RO++3zP8mi`&;pi-QW zi6n{W8w$@k;_Xzm>jvMQ3s097v3_(_W}%UwtHZq<;O>;?Kc%qSP#PyLQA8t2-gkt8 zL2VD&J~AJR(?q88`^Y)Wo-UDI;L5p3&Pg0Kzwcu3MD;|yqCf@ z7`BaO7Sf&)90gquhh*#Nx|U5)Vq`0#jZkufXbB|Y4K0`DgLTV4DI4r^%gdFkg=o}k zX^=U*pi&!$z}JjQ5DtS03wQU`YBd8cqEhj((bzVJ_CK0eR`^5ycT- zG>idYv;$adJ#8kud5Tq|pJs48l5{Z#nA?tKuP2&YeGbDL-(P)E?B6Z;5yfe#Zt0e` ze|5g|CWq9ZG87QI4s@VbkOF}|fPDYQ9vrxY8)zjgHy6gT@ctFX`LC1gXi{uN$r<1T zF47%d^w6P9p=@{g0&R=*|LIQObILd_c3Cs}OQnrDV6VYD+ zBrj8w?b90|omiX359W=a8hlyPM~*w67g~&(+o=Z|pIzXtP-4H*R>VK+_f^O}csq>c zex+yKub*{$#JHYKZhbU1pKHa5086g#+`qIHZ*X#Kn&tbD%&Eh@Tf}L;DW`R1@|Bfl zI<-Pqman^#?z&1qq0d-__vwutd#|7IJ`s~NWy&z*nfLi;Po{>IFW!zaDe&EM&$U*cCl#1@D4)S4MDJEUkRo-E+zs`A?o)t^PEhVxELE z!?HN`$#`U&h*ux*DCBKq{}|~@T6*~K{G&OR8&9=MP&$5s#%x1ANV9wO7Zn2`p9%fb z{k)g8dNf${#$UXDm4FX6k_4%5Hx1#)L`0A;x9p=e$9AqZ(pAY zlKR-c$K+*0M|cE~Sd?+yaIY;oB4y`P&st66Mj%l6t1_W=4a2?R01m7s7FGI=d5%Ky zaD_}1=T+h-bIbW2Op{Bm=>5#7gjs!-o9hKB6CIk#O zQ7s_ZNO;@to~;|0>V2nRIh-Z^q#USo_W8yS?EG-RmA<$wTn5ZLf0IF@9B2h`07!Ow zh+Klj(qwPH=UAZv)77G>q@es#J)^U;vm6Q(dluztfu~TsIARF9_X30p3#ycC#v!~* z21tRHLA`g6L;LfCa5eDpx#BfAq}zzMQ-Fl}hgYk+M?*q*tyCdwjmRC5F7QgG(uYU3 z46`Y<{1inI*^JNLyQ~=%Txn5f_~!{8@Bo6<&0vlNDcc?t1l8Fe`f_N zWJ=``-lGKDVak-)5vv{v7_8eypn>X4&!Bh}Ietv$e;-eayhE=bqGSBqT+Zsym!V^v=m zp20;CUWw@^HpNuI|T-&r*(52AUPP~S*mxb054E;V2dYxMDRa*5kBjz2^;Yo8XKGoK*0CE%&xUzjJ}#(L7_w}!W_Vi=32O;QrMdGY}%BzDTuLxmc+h2 zEx-EO+ZA$3lvn4Du)&2yaR;qGQ_sS1lrpu3?%9r7Ee8NYjTgp3+_?80 zM|9fa8&Kc(-5h#b%>EDk{i#r0>LyjygaaAIW5-TmR;*2r^br?!$zTcqeX4kHrt}?M zk-4&33VS~nuHc?xYh7%niHjCZtvE5&k#tFlGwpgV&KY{Qxipl%vts4?T)ZvI1L3C` zMa8=gA!KQD&3bhOV6~@gg7IF6-7}tpDVaxDxiwP^9~_r>PCDR~mj9a|RNjU7mEyq^ z$RZv?@94W-55inFipnbN3|4s?V*fm}gXAGbaqW+r%*{B8Q8^p%%GClaX8`ZgA)=Rc zy#Usvc{sKK7g59eu6kWU+ITrEnp}tXwFU+T&i%8FAj$kDr^9MdbIJeTEZJf%&x0tw z(>#dA<=%C17Tb4JB8cilSs-BWNY3=5+dlQ=8SXX<_lfnqN7FUj`@n8Wa|6@6MJuqg zLA~!q%>v9h&Lu%#vdq!8jyRL|{g3Hjirq16H}{p*i`H;+lqx_ma27 zB&jqP=Co9cva$!9f3)*b6ld@j0HAAQ%YZigEEj}BE}orEeLiT7S8lwN&vxRZ2nUXk zG6T8dXVOw#>K>UTSIWJ=AAHPQjJ@BLg#(jf)lbhv?2?YDF};)Q9alzH-z*4cp`94Z zknmO+h<}djlt4j8wDJaicDc}eDxKp0l!qRv)O#&C86lSn5>pxCJZaJUbB?3$$I7n~ zcnRMfA=dRzmKQSdG9duVBGJJgM;YE_QicpbiU5S$s$-5?qIhiVgeR74%V_~tz`#o} zRI7?J0MRDbk2VzSdS#t&#?EgeRo6Jjz~z;{WzOlV6uQVA->qsxCg5w13UD9hIq9 zyAtLH2DUzdsX|e_TgSrDZs29Mz`(@tVOC&)$3iK?3EV1&R1i5T5r`6uRjFLpdm@Kz zJDB1dryWnDoY1T!9v!+bdv1!&Ag3Fz{m6$7>*+8paD;{8`)!{Eg%49v{@i{R#a1-w zcV;Eku4&nJ5MN_I>ru8sHbVv#BiwU5`*yE{s3$iGrwY`!=NR z(h^G3<*TGZN0P1wLyh3ZGojPJyc+%WYQa8f~%@J^$ng+sw6Yb&g3nkxQn z3Y)}xg=J-B?RCz0`-_stgW3ONKb>|9D+;& z+m-NH9lz9pR7}#^3Iyk*d@`;Zm{F`?F=_5!CzdtR8MTy#R)Hy zL|D31B}0Zu)r|lW?SEJG&3FrVA@kgwGET5`RVb4x{$I}2tfYe!6#$jGZOE;+EuJfR zCqXuy`sCEq6y6kQHuP)P%L9j4t@aZCjc`+h>C78fmBg|A+X5|pTeRBTOT*G7nH-d= z>kl6$HuMb`jDA)&7;F3GI{94S&M&yggkg-d4NITyzRZmme~pQc{|+wd5-(ded5Fbx z=hp--**Ma)O#km?CbI`LtoQey^>NImTTL%@&i!Iy zBsfk`;{lAihI@Oq4X$0}HD}4#T6UCm-55DBY(NzEvxPYyl({E$x6G2!+efXYy?1E> z>!4ut%aE;F47#bxv{jv6C^g4j;z#cs7$0U-pL+U@oa{U?z>Uqkfn7fJ9Ggtqas2mT zg5_;i#)l8%wQ8Q;BUSD&iTFYcv^6~v>al28gku#ASvSZa{0dI71nlV&h)&@ z9`HhKcVZoGXntQ3amLcWDjTq26lZV5bOh6izu2ktI2;%b&W7v$)iE2)p~BiFS2#(G z6cZJe__idVEsx=qF`j)R7^LAz3|s{{@7UzD~fovc7~CZAaNcm9nu66av==1E|JAJ<8hG1SE|?cyH9 zPSFjH6;Lm}!HLEfhqA>6oj?x_P3-q}TJME;vna3$ z22pyoL{qL4^v;}@W8Lrke}=t)Gu9l-vfI^CJ0c1A_tmNZEg^Jx-5Emzre52#D0~yZCKP>VApi5(4?|;12pK}!bz>Ur z_c4F>YU-R`&oAoSBKrm9QmeQQTB|Qe*)?nl1N=N5D)Yx&EV^)sk U^|-G1c59UGPpLFz9;K=MAM0VSB>(^b literal 0 HcmV?d00001 diff --git a/assets/images/components/spaceship_railing_fg.png b/assets/images/components/spaceship_railing_fg.png new file mode 100644 index 0000000000000000000000000000000000000000..e788fde04d26139fb820b62c7c42dadb7b3b7c4e GIT binary patch literal 16318 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 J@^u|T{tpDWDqa8p literal 0 HcmV?d00001 diff --git a/assets/images/components/spaceship_ramp.png b/assets/images/components/spaceship_ramp.png new file mode 100644 index 0000000000000000000000000000000000000000..814989652dce688b784a37362cb3be7f0b1d875e GIT binary patch literal 22068 zcmXtA2RN4P+ka#hvPVXQ?3FEdSB&v-1l{#<2TOh3B7ewnfM&tISd9vtg51@gTY{V!*3k|JouZ7fg~T`KW80O zjGQqTLJIU73zL{ki@`8sR2AiQ-G43DxOo{*$F_NQZe8el@#~%V-MDDWyPtTCD$Oly z6<#!mEj^=DlexruNnokgNGz$uUW~~wZpo@FJy`P$;mt?%%r9|hUJzqRRk|5{_{;Kh zp-&}o%-;L-Ws%o^|Bbxse$*WwB^z@?*zH+?r*F^GZs*i-c~ZC}W=pwAN{p~iZ$$m+ zMS3hHZOS%BKEv<4zF>&KWRPHl zEV{j0l)u}Q-^uKKB=Sasz52JE7ObA`?(UoL-wH!s>aw4 zS5ss-Wh*C-=JuFW#99W6Ry?2Wzu?R&OdJ| zHRQdaP1(Z4HX%UlH;2u|u|oUI9Ny=l&>Ic0q^`I(u%e@*Cmkdhs;)7df6gi`E&bcB zVuX)6yv0m}*5yvh`8LPo@TK7BQx_jsAKji0yq!@;@Pp3=FgH#*3{S1QKZA8}cz9T? zJU2f-?|3z(J3T%9Qr-9}NwC5tyIXIq6Q5yWVS4drf-0SRKf{~PPESwA#>K_)8K zE5WjcWoKtsG-y*!M}!xsUodzMSNcs4mbk=s5zX6_N=k5-oRsID)|jkLOiY;h!g~1d z;cQDdjetq5*S-_%SybE9x*|(7fo8u*lOU0?DkencWyzW1p~dYBu!3P_!-5|?O$Eym z)>Bw;z4Pp^+OyyXCzs@IJe|VBjbUrQ#YsuWz`(FHH#hePuB^&ovN5vYWa6{*`Sc z6(J1gf)!wQySniBjVm1{|G+Jbz{1DF!-L&SxGUgSh6j)7HunY{yd^v!Nmzt5{Kkg2 zZ{IGnXbGc2U(CT3Se5;JF(q;SjI4Lr8MtN@Hu4K}baXbbjWSMuzeeA0i)5_!+TXCO z7+Gc~2=IGN3Ky$Ez<=)*tTNl5A1n(DicRjpyWTc2F-e6euoj_B`T$Y6QZ{-9BiD6s5xr7#wxL44=*XQ%0o*r~QCCRwk&wMld*4iJiVjAqz{gn^V9g~z<}^I@9zr-wbM(!{VXMzvknro??nfay)c)~;!P zAfyLjFy`3C=!W)O9fCa={?h+@u9%2szfaxx_`txxR@L*BUSJ+p1cm9y77&C%p4Y5T!h;3tL6c^EAQThqi?zr#i zvFy<#iSMH)PoBWvUXhT(gs23Bdc)RjAESSs=}Hnu*=t>XhcB7YOsLn_)6?@X?PM!g zwq~@v7m<6fIxWw86iP-{qiNxjYJuFw)aQwpc%`+RzGxH|sn$;hY1#zqBrA-g&4 zvkSDew0nPFX~{gDiVz=@aD<(cVcyh!6@G4R?lYzM zR(Fq}Y8`I&$etce$D8`>e~o5UW`RrXCJK=eJS#}lv;k|S4qnIPwbp>IuBN8;c8Od? zWZeylVZ}Jyoq@^I=~$F;xM^usXBFS{zktGS|Ldc5e~<6U=IQ6%G0)ZiBpA*MN@J7r zA6(ZK;p5{gEGjCp`we#vKPn5-j-un*r9OP!3jg5`P{clH3 zsQv>lJps-c&)t>ZhevR^zBAw62$wVvvUtm}TXcN=`n7U4)pKQkAN|Y``?}*Dcw8c+ zUd(Tb%xg@FO+P;B&CpB|djhQ?=P^7N=sWU;bGW_u?sG0zQCR)1J3WM7_oJkD3?WOe zWI6dgp!S9CWm*Oy3Tf{F1$P;0>Lt~fpfc=?v<-1(s4io>wYxQ|#}FjP^9zFo1}K-4 zFPQPag*$111wZnauCcN4Xm4-tq*Il#*&JR*+6VDwR7p>FeNT6L>W-J~eW4Ud(d$Uo z8xz@Tu)nf~bQ(mDKVBjI*1PiZaw?}|$b6Jt@W`KxIQK~Jj>1nH^3ysmIMg6W)Ct|S zc0MP`P7T_HJ=DqbIA^dVgdy2w7TRI$xA`8yuXZh;jaM--G2~x=W9J3I75;etF3;%m zgZVy4_8%uFCq62>eseut6wjviVlJ!49W6bSJ^YDHa&65I3cdVQd=({;${WJ=V_%;B z%ht_(FUY1RFITX7)0}&|mQgtTyS9Vv#i2!)tBlE1%!3bWP);rm6`R_Z-zh|er@>5+ z;31x(?7YAdTBtzu=B9cqhZ2Ph7T3u{X<3VL}AiwqM98purzdSqHpG_P8 zVA)9xq42!y%r|P@MwUkbQn_pW($FGDM@PLbQJxE)D8|o7+vC7%TaV>2DDqlwp)vh} zHua2whS?8XQPuY!DicpW!}T9c5W){1> zjlqO8s8@=Kh=>qD3H5g)3Gr!6@1J)`61N{a8ima=(9_eyCHz$H((r*-Xej=<14CP9 zM@L7TfNAZQDpuW` zi7}g5ZAgR#U%tPcdo$%s&qdN>>+1!BHWl{cwa2n2Q?e(l0s;ag{MeX;8c)Y{KqURJ zphf#Iu=tQ3b16f6x2s4$_&T2bE9(Q<)h2+zXzX*Q#mz~Lw z6+JDJh#Yt6*A%Z=Ya|qS9UmVbIDySj;+{lHR%cQ?ly>du#sj$YMkCmGN`Rut@!bdn z!8dtLI3;+yTumv0;Gt8}-rAb)&rQ$ASM(JU7y0Zm-nf8LM>^D2d^Uhax_V;$216bFNxB9j0q0sUSvtsu%wsh9qv@5x_S;f9_huWMhNVC?z70|cAd&APk#chuy z*iFu`jEM!DUW5N8uN}-~M#(@SjsgUZeN=T@tA2{Ax}9LtrH7xLWr8zf<&=Yr=7T2t zt2~GvR|f}&H5Bjl1^9}l)Dbr_f1<{Q@|vr}K;>QxSEC-eN%`0iKG9}tS%+1}p1 z_r-mkg+Ml>b^!OqkHNt~>BFV69>C9W3fbpFe1y70{7SO`+ztYiFotja1MylMz$6=T zA_0v^E!7(!3iQjxbRCZEiDvymznkpk4ZekI68)F<@;;~41Cpc`F!{3gxBV5zAr$cm zZv0-R7C@;ejyP5U`&64vQfGLU_oTf`xOw9*$Bu0LwHl{fj~#@BHvtp;15yBeunn$; z$XGxUlE@ydH9?mczJDXLm%w*y;KdpT-GzeG3(QLrlhY3w{zkIy{Mr*?()>Bcq@?|^ zva(VFa^e_)%!XW!7A2-O$DGOI2afz+p-n4`IVWpu5w&#h)v2? zVZ6TNSRQqG)31JiO9J>40A~u_t!Ama$=E1}zHIfW3wUoAm>zR4RcgvK;)W2{aWzZc6pEF9#xd8kCP!3@2;~H3ibG>2JcsFgGCn6%M1Z*?Dx(hU`Po(RG z-~lo4rvRd)#fXq<{oH{6PWo6A8;u-6_4YjpO+!gZnUkGu1Y7is=NMwah4kee zXFnC+8`x)O`n6<_x2ngFSKNy4Rl5>*e`TOKPKNalvhm&hWb5y7)cj&jxj8iy2xclQ z)YcHmLggd}+Q@m}Sdoe>WWY@nLk0j2LKW+_tH_Oq6xBB{5GW`tEW8Ve*@svWFdS%Y zSBa`qFZ{_3$kF*2`)$O`kMPBJ3n8zZ%>|O(jF@HQETnLpnD(WY@b*IN^M}IkF z{WrcfhpbfjLd%A3;V;MR09*4In4XmD+C)Q7Pl}XV4)j7<>TsnhU5$*UE&@;wYO=Dj z9zd<^6t^8NL5)|8gM-5WfLfIu0)?J=MgQ{Ut5q42P(9|NEy~L?f=qDQ@~AoABuLpL_)}@ZU0n(5 zzb$C8C%?y!e~&N!u6DEkfJ4Q6z|93cd$<(nEJCIM8{d9LEr9d@w8Qf}gM`CG6O@`M zC|p_)#=FK9O)Zej0AKrHl|LRDb6G5`@IjoM$H~bF(WcJOI^6~3q7`56lN))ij~&Vn z0lC#<$MfI&jN`VzfOMAAe`g*{UTBy;{6zn(k@CDAEi~bW%MATlfNpc@KohhDKjpk;NAv^M^ zJ7qeVWIB=0?Vq2p(QrcOh6Faw&%eN{mGw}CO`*J^!VR$qA4_1FkD*gt(0SY;ujcCN zx&vLbqULyKWEFj(#6lKE;aiG@Nuc`$k_Cz;to(x*T1frF-YB1~OoRc{Jq{+DWf;!i z2B5ikGFa@hy@9BFk_J14afBm(ayq9?sbQZ!z|WcZx})jht5>gju!3qs+WhDjN9vr< z=Y9!i^PPG@qJLBt-Jt_6`@ANSDV#w&;9+hPe$^3rBXa3>@*$H< z&ag8^sbh1g%mh|uX7!st?%E&wY%dHxHX~`?!nuMVnq_C4lZA@TiiP1(;(k55tZdyxY1_ra=dG=+aqw6jwd)LPO&9e2?kYOr zsrw?00TtPX!MKS><#(2+qGV6pfp9iuOKs~(;>ZhvM0LDSP<&zs8dLeLKVsF830+V% z;_6Ng7VQC-?+0nu{km3T@$0!}jh8RHRCc|YLaSahb>j9o2xALKjKg`88aI~;81HXY zF;s(bzu=rsia}T1o!fLWi{)g18Q*l6pFf{SmpN=T00)D^M8II zGLAvM^FMEz^yA^ha!!W2{Zk0E5dt0Q|9ZVe=(0g~5b)iFI-d$)`pJSSVr##BPmjm1 zdLL}LiBYc(mrfB!wNWIuGuAk-Q`-VT3$#hasjg>o2N~mxzZ~YT$A&ns zYK(@Po7-vKQD@yzLDS?{e?sY}?Vv3kp*#`*qJ3Oy_#&EnIr)8s7Psyu(iE5;KrS@s z#bW-#Lu9<>zQ(M$e>;;m3&<4jqDf0E)S^CLd8%i(BL{bqc z1b@3X47?q$Yz!x4gXy69`9&!7mnwNV;_E;*YtBvc@i6-r@Zx_)tF?exE}~%9hR{7* z;3>B?=!ldlVA2%v`D-R_q`3wG` z)`TH%<&Ds!R;+wr2Im6mW2?eKLP8T^iMT)lW{~bhDQ2O`?>jy+BDGh1dQhyTP%9)_ za;NZz^2MirPpzLkStdQ$)zEFeZJjf*dwBd0SPIgo;v!^w6C#cLuV>@FXAX4ODbR`b zsE3(ysR3qGpmgm?lO1p5TRWF|awQN$$i*y!Km;g5cW?~)h?Mss1NNpSVr3m0Kn|Q5f^(g<}1WTafa0F#`ur8~^_OJ0{-rh${so z_B1KCqIo1nJ`q&Xd;$;v5<=exfVU~&0yV=9_EW79^yb92cp(2n#dH4? z3Sxhtxql_{*rf&Oll14Gt8y*kk)Am2Qq(vD?JJ=c!{$W- zGH?n0dP^E83z^yrNTA99&FHe>C2X%-luB@srY9hu_^vu$PI3A}LWH{Y_0 z5(dc%OG--C<{@f6!~c-l-L^E0Q&Nd}5D7uCbvS-{GA=GEDhgIX;~T7I_@O6A^aX_b z3GV1Jbm6A#_h4UCsw*e7&iKUJ%r8gZw0Z+pg)35IDV4Mxs5Bi{)*1ffK&j7U&F zLGkth(93xiFF8I0J&_bu%}Ptu%G{Nyf$RW)LPL!iE0nK54%Y0mD3pi=a1T#P- zXNLfOoOjxj`vO>yvUdB&-8!%*aCld^1r})5nS`A8MF7Aq96CeJP!NUQ;^c> z&uN-6VG8!dFGjb~QmTbD|MqjINRnO}t2vy4R_#b8%Ut`;6U2H}q=Gq2YcvE`fR0v< z(7A(kI|#`m{r$pgUG_ekG9`YvISVI9?KuFpO44j`g)Yc65nAqk1BuTXHo+(MP{{Ew zdw;?O6jtv}-|>Pf?W#jJJcT4|3{ZZM-T9= zlC&sM^%fwS!C$|Aor{0M^Yt$&unX0{jguG3V)?|62o6s=!Bu*IJ7}lD6zXI#DPrVjMK;=mTnE|_q+AIgE z;XO#NzD(t)R5pSD{}A76$Y}saqLYtwxj+u&6;uU${c(-wJ&uqk0-JO9EDfb#64x+b zUhjR_uw^z?wK#{I1-bg4!o#*=^u~PWpaHi5T_y?q5;U0l>nVfUjo4!MYZpmWj`or`$U|Qi1HQC>B1WGe zg>}{+8u8H|nmTtG%5yD$w&zs+J>!1Xc<$N_%d!SSgdG7=JP{=xIc_~Gqon<9ouaKr zS6`n$fCpEFO%34G=|+4V0~^5^8vz`5uwKgo1|x!%41?HIJwV&8 zM!%ouSkrZ%d#M7o7O9ZJIi#)>g48Lhcz6aL)f1$c znfplitnUDpFi5|Hui^sFX$oTI@IF-f?2W@bcTb?}b%!g}tH8i{6c4W1RZc#mM*v4| z*j-zu6U2D7omP7LqoVZmNrp~^sJqOL7r-q%`q|^N(~qRNnGEmfui}^cO-&E_;%h&G z+?Yi;nxnZTN*7_(^o*EZNLW~S@<-Kq&Hg1shQ9#)EvCScufKpreoe(3w5e_+@SHA# za%?=&c&u)TUa(rdT6-AtB!1;%Xe~SjM4sF06mz zV=O2M4HvLtBA`9DAATGWG1k}x8E8w*h)BQ+E{l}@Fshm~0 z@hCCJ4c^un)eO!s3+7^34bbXWP+Au^n5o=z8-*H}9~l`LOIsuP|FZz+IlI4@^!)(; zpbVtcL1sodApjhoJ+>D_0U0oUf3kRW8CGW;-`%*F=o6LIE7!zIJvH z^Ly|N6eA=$j=4`ojKdz&f|kLnbx8%`ZxqKI*In;-D2)Rywy&CwyIc9=vBRqp6;o5w zQ&dJg5SWHL2Q)zK2}Ic~S;qSSyy*A3lWN@AJ|FKCx*}o_lTNktIvn28#|K;iKHIN! z6w|BzoJBd?4$u_-Rj&Mfm|%DW1+EJ*xyw#D z_tlhSSy@@Jzql5e9wF`nc3B-TWL9RfdWJ8pKS2~}9Rjhy4QN>_Mcr#@4rmYu<;C91 zk3(&{1hX?t!4onuG&Cfrzz%@)MSNiZ_FYTXc9jk31N$Kt-5;=Y-n zwK(6|0w-${a`p>Zq9-dsli*iqL3d;!$+Q~o<0mWvR60f#=RVqmkdu<8HHec>uVH<& z?(G4i;SPv57GGys2~=YSQl&jzcel2-{Mayga$q{IuKMg&4}k|o8^k0J-`gPuaV|-A zH~nVl9MH-!hbCfixxATorHPwJs}NR=Vf%{p@*E5{td2olMbbs2p>WpL{`Yy8&nU@P z6h%^!$$Q%z8BD>dPy<0wZ96>8oOb4W`gK!u-(k2+dE5Wm#{?dwalrDum`8)Ok@J==oKxWC=%x4iSIdX7G&=|2mB=xN|*vz;FkI z!jTflV`TM6UPgKzJf-k@Jqmef;^!H!ZYe=>FpZwb<=;32i+=A2nl!$3;>8GW9Z@`P zpa`Sjf95FO`JVD|?y(4+rnmQTgjtOrGqjnHzNaVNIP%RCJNPSFWVB-{84jSh3Ea1=UIX2~2Y2+#~)&jT#gv3u@3`BaFdUlVr6?0^XqzJ*0y8OtFp2~dPO}_P19O;6zY2er0MNjxu0VcO1iOK^E)Eu~%e4tO{v9C0v9UcA2{}Fe-C)QikSAIwk+w&EVngfr)g^dfI1& zpi&NM-1*hackmNd==Y7sVrOyA$Pd59#k|UdCbWu%WuPDA=)9l)Hk#vcD}~=nSN~g3R904Qb5ZP&VpQj4HEbiz{B%ON)p+Q_+OWK#0f(T-UqKzM1>TD{>hdJeCvz3g9cF0 zHr&cs1)z{;QY5KUB}`DkjnVkIB)J1p&kE>-AM~y{S=p|K*nKGramV$_NV^0;a0($S z$ItzvY?tnlk~XiHk(iF4O!9-m#^iRDT=sMxH;{kmRzfdL1*wzhT*jCrej zTPP%W0HeeTbijjw@!E+hY)ro#Jl=oPHvnEkmu;y=zGUlvpCa=)k*%6D86FZ(eH~+b zxet*%&4=?jHoa)37&@BPc6i^k6LG`xSHBAbRreXx8!LS=z2VF4q>5^8~ z^Frg69$ntiR$;&9Xdi`mz~8*iiGB0=O0tj*ZtUOu$PKs1;BDDd$vZ@`%o3Ri0wmnm zCj6n{#D>QW#%Z)xf0z1cs_&7aWBtHawHQMI*u5cdP*EQwFf-OE;*7vIA75iV2so4 zFE`S1tbfhBz)WPl2n7u6pb1#evMzrLq0_RAD*33BpY%g9DeYZ~QuD|(A^6k18A{dd#G`!cD|l|ONDcc!m*DsM`y1sl;deS=V*vaO|8xs zUa_~+fB*i~1vIYtUrFJ@>9Cm~txnAiS)fZ_Op5XCRN)p3<1CSvo(EpKvh7s=1E&KU zF_U)1@ee(EiF^e3e0juHqxaGLCYss3oib!_`2gY}c|qoYHDfjSE;%NLDZW#5;QM!n zRM|3WipSYAvo=yTT+4}i<6@otrnKIsMdh&REez)~;6 z9?bUsCrfE_pkUd%^*`e8F*2?vlpYybBn1VdsfD z835^?|29^rxR~=`)NWMQKK0MK`!%m(dkiKg9<>Az8COGCh2kpx$&@bX-;d%wsu{&A zaIf*t>eGR}xMg5qARhbFTQ4Im1=d2fBg{@DYO(*+d^;i`K5E#rgZRADeD3_$MV@n#ky8>OGMygRE{a2K91X(=3Imn? zH!gAQV)5(Q^I;i7>X&=>#EmouDm86f-%?J77fEq?%^(>E(bT+-#RBqU^p);dM5iDT z0I%OAR|qjyae!G?Kwoj?ilz!W%2c4!qT@)N?Z|d%ruLeSmGFvbMFoR_uP7-tp<|k-S`C zRQFnXFW35*!7omBaf~F$r+~RW%z6H5D-1j<3epCNg<=E=UBK{m0YNwX?C0;7 zZ|6yd-a4|>HQg>9=sq(rtfEpg_CV+j(y((g-riWp0CBi_uZHebFcc$TC}s^9Oqn0t z2v{JZrA=SM@^xSL_-betr3ietVHDyZ-&cV65~w1{jp^C`mz;LqqYYa^dg{PxdZFH*IST9;4*>0-s_zd2@Mr zG@A1wWb)TQywGAr8^!0qrHKYO8!vjcqbvCz$@XiI5|)lu`CTS*7Ut+{-9__ z)W(X=2A`|6;klGeV8(Fco25V_zkLM`&D>1pJj)oe8cU}3DHpm9mLt&AFV zpQ>rrNXy#uR~+gsxKAbK^5`Bn_g9NwbQdQ1S1{S{YI5z)<;k_)?bG`HXsp;K{szrMvUn z+=!aR8>8YkQ2@^8Af!mu+&#OpSH_xO3?*|C-}ogf*Ty&|zFy3sTYPwO-{_5z5gJ+O zXGbDi+Cq(^QJf`AV345fj`xS9y(v1T@a|E#Vvyc+btYvmAx%KGmq(VE_1VYk!GW*W zHp7XDj@n?lIS*t38==MbFaVPi3&#XVY5_-8LzI}^zkQ!V7W3+T|HEmwru^-RXkoM4 z`GrvrUq&xXT*d+9fbfiv<<^G`dl(gkZgwVP6(5C!CD0_gZqZ~`)fmc=w=GJ0PTnq4 z`$ih>gSG=P6n5EN#%h81&&-F3#YY{Q9=I6kZ}r0vjZV#_t6={C+CXVp#^fg|E^Z2l zL0+}tLA2wK4kyk2!O8q6thjw*X*ta?Gn%)F7Jswxr~qOp^~kjx6uAOW0WmF`X%g z|JAK9d&?OX23~6AZ1#%vb$g9AenekM7@H4tMg z!ka9jRF}_FAD))L#=@X`pLOWg?R#5r^x`#}>Nz`6j0(|_kMG;^^6hg5HwxMEovf+N z>68mEBn`;1e8OY4J<51pOGa-S1iH(02=-}3p(`;^*vjwxgO`N7VDHxJU%-QXXw z+mY}pi}Ed}u>+j|DXUjBVJcyD!*qTL=e6{fzSWRaBuGUssHyhi6F$@KjnbjSjh4Z% z5r78)FQtK*5Zw-X&bK>Qhw3@C}_U=&GWFN@GSu`Ph98>%(4+<mX9{4SKtg;>gQEV6B@$ zH-rV&Z_q8~Y&C(Fpu2m=ib?4_(gxg@*#>8{ZTYa|pDms!w|F*NNsdhz>ujMp4F?9T z`QMesStRp}7?m%cn*jF>l<62$?_4ghPGyOG6@Q2IrBs~54zt+A*Z(@mi-ccz$_TM5 z1;v3@*?iZ5m1_YVzN39M3Bn=t1UZX8Fd3QL^+5+WGFi4JLHhc&)TvBl}@#8ma{ zux1?J4EoYPKb5{6C!>)|V3F4>Gtw5QiFiBF}e&GZ)8$j)bis$Q0%tl8x-JvW}X1&0)s{f zG2|pL=!u>OsDHH%PSsXzXE{14e5tkX(e$K=zT@h8!Qo-hvCczG1T_O4yn>7n=0a_S z4xonmwu-Of)}>q$OsFKq!x1ptL6-Cr2r=H`XMacg>=JEQXjs0njOi0o<0?&ai|~(X z`rT^6c%aGt3z6IaW!48!aQR`&_uy_%M5dF*!DjCTb7PC+GfaHNl6y!g7hFC zEyVG;V@E9J(zC$|4WIzHDwa5#|1p0{+T@7d}p2V&WfGc%UARy(VhC@2CYMAi&yobn9Ne)nmc1k$@0XbM%bc z%l|b`sV;Z4E_b`GO%{t+q~S+dyY&l<_WN%?ild|FYD(W5R}3v!7#_amJV@0kBW#y{7F&EKCh-v^H8nMyB)&fSPl-VwC|afy zZjD(Hc4H60C}48&ItNPpgDivHx4N$@OWb;Q<<={D-Db6$*;crXvmlf|r|S{X?!_NZ zSHa-+N3Ekj|HB06!@*!n|Y?-b7>P;4^Whzg`e7cpVn)QTWc8BjD=_ z8Eu(d_}BP{VM<3%=+qtn{L(&;C5c{fs6A`H{ZaneW{iX63{d^Ljm=h7$Bn#!7l!vK zCwrWp9$$%KCI4M9yeH;=7XSR@D)8$Z7#~;6v%RgmHTe2CD`f7v2R(9)TH~!o=8Xdr-iUMEZJ*UeOee#>1IqA`{qsHc*>DjPY~+ z!X1|Tpjpw_ZnjAGK&j}HsSQWrz~kWJ_(Z-Ce%?%i#I&@u;=i9l&yEpk!e9yZc*>-H z=tMRNru{lx7RnH(GUw8Bj8z*NKHFnIr7#$(ZuGeTf8VpUT3|mnd|k}0&1^s=bMTaG zUZ=0O_^ZRu9Gy$u61^373dJ0TgV0U{`O^(Tckc?VHDm-0amwpyEAg2*!(M$GSC(Ky zZdF@-W@FP^3f&W3G6AEDZBJ)LY{g(Eq>1JhFEuuhem4IcYa|td25^VhVVdL&?K4&V zpKrhZH%SxmS#PJyl1!|qLEgq8`i?K@p%;{s_XBMAc>5{>aGTbwND$_G3ZqTv#N>t9 z7d)3HGJC}X-fdK9PyH6QTf606GkSP7*wk=_OW!gJ_#|>Roakh3px!9A^&BdKAG!(S zjB!{@ka73>#Fq?vr**DnX7I&4kN=>2gLFU9H*cu@O-bH8{E3ch(|BYMjC_EX&h(~X zSnrh~d=Udjvqb@GH0oTAw@DVs{_*!J&`{jT!;q6(gXxZK2_}w%|0Q4u z&P(MEpD3f{Pd3!4mzpYy5=XZgAO^=}ul{*b$8YgJF<4P(47%M35F9zg57 z4>ZPMo>>JRI>HbexR1f6=dXRF_LI|LP}J#4k?}7jZeljEug$D`M?DCh`@q;{|%`#~^;+3;P$$Jyb1XbUCU3K;or3A>{<8Sy z5nEW4krxGLIxv&gnk?1Wvc9ACb{J+r=f)b`Aod9%f&KllI6&XH^|1}t?d#qEA;+in zPnwi>-^F^Q=mZt-i0W*BK%jv*dA^dVW_6)%$QDcy(|)$Xl5+y>Ll_2=n+1uwwv%GR zh6gK+J7NttHjj_66yGZ-=jT5^rK?i1lw7?yiN+9R;IxLa%@fxbND54eF(QEyhGBE6 zM-%2M{UQ+=bCtw8I%H*rsyVMyK0FGfQv4OKY$IM6lbJL8P+Q3N`pe03qblM%_y3u5 z4d%|eTdb%jcvTwn(-;I@(n}J!Ju9;!sU~eR=<&xnYI8)8TWLcl@YU#|AVbq89Bj_I zHXyfkIU^W45yF9uo%l2yhf)~A#%d=B8@a>!+ z<@J9r7JC#yh7_KcJPTS^dhrE-PAdQ>mIaSMqI7nI|Har;$c6%60MW=r_2p(gil5=j zgtU*bF0Hm_erhWctV;tEm6fVKa4!5b-AM2*w%=bih}Fusnjgrn7V!SEq01~FdzgK% zu2EjTBU5=PVG1vLviK1wra8Ko*;_rY55SYC*MC~c7tJ^r!U{RWootXD%FS-^A`1K)P9P{DHt@Eh! zcmW>Y^O7kR)G?Sc5}?#d-;Fek=PA|ED#hdG6gqJ%m-L+ERkF4+hge6ac1h<8BDOBX z1*4ju3=<>ZKvW1mdR3+o_o5Q_qO{Y@llwl@OAE0Z^9ElfG~BU_KuCxUn!eB#}SFqkqMzP^;b>?X3k3=Li zoEe2ICgm&)f`?C)#=(yRsW`Y-vf_%``=Hyl>v1Fbtdh(jNAD?9)R&85)uz5Go$7>l z0M4`%%j9!HvKffd3(S_ajwTVa}3O@c_N}LwGG*_-0{mHnsHh7gwCySVo?f zlcgwvdn-lZkrGG<~tLZon9NLMrNZmrb1;!JtQLWPp zTiH4yjYj?h&eOm6BI(&~{TCQzd{sGroIiIK@e~WZ#QSPu4f^{?t{?`Cs~QH=Y;blr z0eZ?`2QI4`=GivZnbl0%!puJG$QbdL!w<2OYRb^krgZ5#I@+pS+uq$jwk*cl*xY=^xZtRs=`mMo^5w|N9yyqj+#%kqJpn zIxtDZ38kiuK-#H>CoUl=+YpCu^mR7n8+FFJ#5$|8GZOEQeqo#LLAlp{|Kv}?0wZ9d zz)svgDa^|y^w|rub;612%D0s6T4oP~jc#U}@cbY&XkRdr;ECQ`j#s;W0R)lZqS0Oz zQ{aqpTbCfTot3sEPZ{%w^_=P`!iQsZM09EoZ1Bk^6aDG1#U+`T;4-IOr#IX{R2tFA;En4Gtx$Y*s`t?VV;`swTIwf< z6jzZx7-@o&rP9_!358g4Iz2zEAt>l-Q;c+J<-@1{W+%oG1{+%M7XJO^r}8FenBPn^ z^^jYH2w`+%KW zTqo`6U!Fuz==nxt3FjH1&zkYyI6w*D=v~wn@=-C6Ty(}tC-6DlDx>)>SRED?DP?~l zK6Y?GX0ifRLlr%eFP#4A^3dtpFO*uC;RO0WXf9;GmzlGjZn&V5KOZ^}Q1nRlUT6>J zt2hP3mVbr=U78ctp@tTs4@h@{|RQ;~C z!J`)y>*5SUQzzUXEoi9_O2iU4UZf#P#>J?tcn(964Q>s!&@SzhV;;iO)|ePfsBF&; zGgKViRqmiuuz9OMic<;|COwzVbgTS3rS~^c>_!M$4Q5gTQXDc03eVDy;exaLV$3R` z#R=aFqDdz`9mRTL9^-OmB(Rf1zq)hfMOf{POn((qi>r7TIj1n0abIQHWx^Jdj$ek~ z^yTv#l@r3_N3LD|G^Nj*-6ZNR4<{!LN(VIL_EMpVqmL?JK6p8Xq6t64h?YqAyZ=irla0_U!OB*8cbgYZU(7l>uf#v2zI zEu?$b#QnXovmFHe`L+vhmSFf43h!p2z&hwL)+cS z%$Z83Y9FPjK()hzf_>Z3U8q2)<3fytoFq`-Kf%Q?x5H#BOpTqmuUJaTN9E=ge&02b zczlbZCVXaBFDr1b2l>iy@aFGhDaC_xnU^t`_OnfbFW|F;VEjT&$E0H6D2U%* z7+(DWbEC8-fp^m#Hay4GvYlHA_!~R!um}>de#Y>K-Fo-t9>L`P!!e$1H~_4o_btSTRpmm0V^U^i&O+n6yAo#21((!PKD!IkwvW|V z6eB0OcAif0faS&CI=O8~4F z5U6u&nnSH2GC>uYWfwuL6^}kYql)^{lK(jC z2WjgUns843lQ2f-Z?g)mvN9T8MZQBU%PUd)qAaviDEtz1wFQ0%ym*lUO+Cb1l(aN zIaiMC+$zS)?%;iWH)oTKy=gcPmVb zzg~KgO&9YuG>?wvrjKOKYtg{I&;FxwmxkO^n401Eb+%)4?K1(Fmtz-L4{kM{!>GdP z-;Xe26~Sh8%kEPAxR>$pgrdfys&U8pOW9cFqdo5{*9xdSO6Aq<@Gdc60DT3Q89dvH z44P}Ig=gRcu*6#?Eed7^MLsCs(raw@HLj%PNv98EEX@MOk>PU1l!;PFxghF+#*ZM` z%;Y&%0)ZNAZ5iMp-^_a-HscsRN_qR~wGMBhe#bWGWkp2Jdsxv*_u?20ytCL%X2Wao z6ydXoFgn^>*?pIttm(L-7*CulD`GbOkhy;S!(?EcZnU%+@#fwO!|Me7dJtl~updjT z1VUd}Y2bA;cwpSLNj?cv+H^X82rfm{=ciXnX+|n9Pj9p8X9^eu_LM*Pn^!w5_Y5ik zt3k35L>gJhPL)d9xC;j3_cvk-8>GPuPBkta{a+%N#aLf@MCjTm|6dE&9u0LGhJRWW z<&r{8g=wf<4pN9*r!{2M)VPFd(`q}jqze+cOrudTBxF!4)zlPfwH&*4+LBAIX=|dB zYEnX@j?$t;XrFIe|IBgDH)np|@4LM3`@GNdScT5_u`Jm#!n(tocd?17fImCG|G&Lp&?7FBhW=qCHbROEzjw|brCMx*6D zliuAp=)MPmm0EFyP`f~9(f3J6Wi{<&3}y2xeZ?-ms|0ZeyBd3X%^r38gl#4&XZrXo z$^CuSh)+WZcr=u$QK9B`^yWQhazwpHOBOlKTV2wyt$V%uy=4_P!sHrFxbYQQa8%^^ za|jPQC3ik$;)b>+2v{ciC(C#^qj)CT8h+fcW7;$;_2~STb5ZL`ToPGVVLLk zwzco$+l;h@@?2AJXZm=VH!g%T(B_( zeq&^-H3|Vb;W!JPuePc(kHy{-NjJT!aP`bx9iJwR>ka=j7Dg*cba6YA&o)pGseh4> z^3PNg{h?ACi=Ll4_Dqfu=mS{KfYQuvYd%|MpP>_WFj3Wdq?Y^ktdrIAl#Ia`i>lM> z{Z4PU6>{!unw@`DWWxBwTJ`OyxVe|#p{Fd(3DrMkQvrAy~&UWm1Dlp4{yb&#K$7g4UZt&I~Le);_6?*=4oQ6v%2HJjmJ&! z$W4HANfB?svEcGh)(Ma_L3$S=KSI7*5|gh?v$h!e^MlRix1)I9ibX3m>i093@szHM zBQr&g78+}1gJU75bwGRuu86Xv0}d2!hRF%yGZp++T!uq&&Rqmp zMHN2)wNjtQb1W0y#a-p_m;?6;JPNqDq6^OVf0^VTCVXZv;`2F;zCq?6=K|2c>2Luk z)ZsMEjU9{n2>V$LQ2-ebe|)+JqQVXl3$TkP>`vM@!WHqxBS0g$9%s+Rqc1_w+!%Cl z@!P$OkuLnf>TK$Nm>1@H1VHQdwa)S*Pq0*ujYv4{MMPgm%%S#zj=Ky?4b&O~(NuDs zVwf!-NaPYv#=Y6PzSfv~T2p~7cuB>$)k&)YSn8q;?FV4&iQyq&7!0ut{u_s(R94Nz YSB_5oFY;DrOY*-ri{nwYcE^!_0TnYBJpcdz literal 0 HcmV?d00001 diff --git a/lib/game/components/jetpack_ramp.dart b/lib/game/components/jetpack_ramp.dart index aa5a9dbd..34b00dd4 100644 --- a/lib/game/components/jetpack_ramp.dart +++ b/lib/game/components/jetpack_ramp.dart @@ -2,45 +2,52 @@ import 'dart:math' as math; -import 'package:flame/extensions.dart'; +import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:flutter/material.dart'; import 'package:pinball/game/game.dart'; -import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball/gen/assets.gen.dart'; +import 'package:pinball_components/pinball_components.dart' hide Assets; /// A [Blueprint] which creates the [JetpackRamp]. class Jetpack extends Forge2DBlueprint { + /// {@macro spaceship} + Jetpack(); + + static const int ballPriorityInsideRamp = 4; + @override void build(_) { - final position = Vector2( - BoardDimensions.bounds.left + 40.5, - BoardDimensions.bounds.top - 31.5, - ); - addAllContactCallback([ RampOpeningBallContactCallback<_JetpackRampOpening>(), ]); final rightOpening = _JetpackRampOpening( + // TODO(ruimiguel): set Board priority when defined. + outsidePriority: 1, rotation: math.pi, ) - ..initialPosition = position + Vector2(12.9, -20) + ..initialPosition = Vector2(1.7, 19) ..layer = Layer.opening; final leftOpening = _JetpackRampOpening( outsideLayer: Layer.spaceship, + outsidePriority: Spaceship.ballPriorityWhenOnSpaceship, rotation: math.pi, ) - ..initialPosition = position + Vector2(-2.5, -20) + ..initialPosition = Vector2(-13.7, 19) ..layer = Layer.jetpack; - final jetpackRamp = JetpackRamp() - ..initialPosition = position + Vector2(5, -20.2) - ..layer = Layer.jetpack; + final jetpackRamp = JetpackRamp(); + + final jetpackRampWallFg = _JetpackRampForegroundRailing(); + + final baseRight = _JetpackBase()..initialPosition = Vector2(1.7, 20); addAll([ rightOpening, leftOpening, + baseRight, jetpackRamp, + jetpackRampWallFg, ]); } } @@ -49,42 +56,129 @@ class Jetpack extends Forge2DBlueprint { /// Represents the upper left blue ramp of the [Board]. /// {@endtemplate} class JetpackRamp extends BodyComponent with InitialPosition, Layered { - JetpackRamp() : super(priority: 2) { + JetpackRamp() : super(priority: Jetpack.ballPriorityInsideRamp - 1) { layer = Layer.jetpack; - paint = Paint() - ..color = const Color.fromARGB(255, 8, 218, 241) - ..style = PaintingStyle.stroke; } - /// Radius of the external arc. - static const _externalRadius = 18.0; - /// Width between walls of the ramp. static const width = 5.0; List _createFixtureDefs() { final fixturesDef = []; - final externalCurveShape = ArcShape( - center: initialPosition, - arcRadius: _externalRadius, - angle: math.pi, - rotation: math.pi, + final outerLeftCurveShape = BezierCurveShape( + controlPoints: [ + Vector2(-30.95, 38), + Vector2(-32.5, 71.25), + Vector2(-14.2, 71.25), + ], + ); + + final outerLeftCurveFixtureDef = FixtureDef(outerLeftCurveShape); + fixturesDef.add(outerLeftCurveFixtureDef); + + final outerRightCurveShape = BezierCurveShape( + controlPoints: [ + outerLeftCurveShape.vertices.last, + Vector2(4.7, 71.25), + Vector2(6.3, 40), + ], + ); + + final outerRightCurveFixtureDef = FixtureDef(outerRightCurveShape); + fixturesDef.add(outerRightCurveFixtureDef); + + return fixturesDef; + } + + @override + Body createBody() { + renderBody = false; + + final bodyDef = BodyDef() + ..userData = this + ..position = initialPosition; + + final body = world.createBody(bodyDef); + _createFixtureDefs().forEach(body.createFixture); + + return body; + } + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprites(); + } + + Future _loadSprites() async { + final spriteRamp = await gameRef.loadSprite( + Assets.images.components.spaceshipRamp.path, + ); + + final spriteRampComponent = SpriteComponent( + sprite: spriteRamp, + size: Vector2(38.1, 33.8), + anchor: Anchor.center, + position: Vector2(-12.2, -53.5), + ); + + final spriteRailingBg = await gameRef.loadSprite( + Assets.images.components.spaceshipRailingBg.path, + ); + final spriteRailingBgComponent = SpriteComponent( + sprite: spriteRailingBg, + size: Vector2(38.3, 35.1), + anchor: Anchor.center, + position: spriteRampComponent.position + Vector2(0, -1), ); - final externalFixtureDef = FixtureDef(externalCurveShape); - fixturesDef.add(externalFixtureDef); - final internalCurveShape = externalCurveShape.copyWith( - arcRadius: _externalRadius - width, + await addAll([ + spriteRailingBgComponent, + spriteRampComponent, + ]); + } +} + +class _JetpackRampForegroundRailing extends BodyComponent + with InitialPosition, Layered { + _JetpackRampForegroundRailing() + : super(priority: Jetpack.ballPriorityInsideRamp + 1) { + layer = Layer.jetpack; + } + + List _createFixtureDefs() { + final fixturesDef = []; + + final innerLeftCurveShape = BezierCurveShape( + controlPoints: [ + Vector2(-24.5, 38), + Vector2(-26.3, 64), + Vector2(-13.8, 64.5), + ], ); - final internalFixtureDef = FixtureDef(internalCurveShape); - fixturesDef.add(internalFixtureDef); + + final innerLeftCurveFixtureDef = FixtureDef(innerLeftCurveShape); + fixturesDef.add(innerLeftCurveFixtureDef); + + final innerRightCurveShape = BezierCurveShape( + controlPoints: [ + innerLeftCurveShape.vertices.last, + Vector2(-1, 64.5), + Vector2(0.1, 39.5), + ], + ); + + final innerRightCurveFixtureDef = FixtureDef(innerRightCurveShape); + fixturesDef.add(innerRightCurveFixtureDef); return fixturesDef; } @override Body createBody() { + renderBody = false; + final bodyDef = BodyDef() ..userData = this ..position = initialPosition; @@ -94,6 +188,56 @@ class JetpackRamp extends BodyComponent with InitialPosition, Layered { return body; } + + @override + Future onLoad() async { + await super.onLoad(); + await _loadSprites(); + } + + Future _loadSprites() async { + final spriteRailingFg = await gameRef.loadSprite( + Assets.images.components.spaceshipRailingFg.path, + ); + final spriteRailingFgComponent = SpriteComponent( + sprite: spriteRailingFg, + size: Vector2(26.1, 28.3), + anchor: Anchor.center, + position: Vector2(-12.2, -52.5), + ); + + await add(spriteRailingFgComponent); + } +} + +class _JetpackBase extends BodyComponent with InitialPosition, Layered { + _JetpackBase() { + layer = Layer.board; + } + + @override + Body createBody() { + renderBody = false; + + const baseWidth = 6; + final baseShape = BezierCurveShape( + controlPoints: [ + Vector2(initialPosition.x - baseWidth / 2, initialPosition.y), + Vector2(initialPosition.x - baseWidth / 2, initialPosition.y) + + Vector2(2, 2), + Vector2(initialPosition.x + baseWidth / 2, initialPosition.y) + + Vector2(-2, 2), + Vector2(initialPosition.x + baseWidth / 2, initialPosition.y) + ], + ); + final fixtureDef = FixtureDef(baseShape); + + final bodyDef = BodyDef() + ..userData = this + ..position = initialPosition; + + return world.createBody(bodyDef)..createFixture(fixtureDef); + } } /// {@template jetpack_ramp_opening} @@ -104,12 +248,15 @@ class _JetpackRampOpening extends RampOpening { /// {@macro jetpack_ramp_opening} _JetpackRampOpening({ Layer? outsideLayer, + int? outsidePriority, required double rotation, }) : _rotation = rotation, super( insideLayer: Layer.jetpack, outsideLayer: outsideLayer, orientation: RampOrientation.down, + insidePriority: Jetpack.ballPriorityInsideRamp, + outsidePriority: outsidePriority, ); final double _rotation; @@ -117,11 +264,14 @@ class _JetpackRampOpening extends RampOpening { static final Vector2 _size = Vector2(JetpackRamp.width / 4, .1); @override - Shape get shape => PolygonShape() - ..setAsBox( - _size.x, - _size.y, - initialPosition, - _rotation, - ); + Shape get shape { + renderBody = false; + return PolygonShape() + ..setAsBox( + _size.x, + _size.y, + initialPosition, + _rotation, + ); + } } diff --git a/lib/game/components/launcher_ramp.dart b/lib/game/components/launcher_ramp.dart index c05f8aa2..5c071f4f 100644 --- a/lib/game/components/launcher_ramp.dart +++ b/lib/game/components/launcher_ramp.dart @@ -124,6 +124,7 @@ class _LauncherRampOpening extends RampOpening { super( insideLayer: Layer.launcher, orientation: RampOrientation.down, + insidePriority: 3, ); final double _rotation; diff --git a/lib/game/components/spaceship_exit_rail.dart b/lib/game/components/spaceship_exit_rail.dart index fed97e0e..e4be9b31 100644 --- a/lib/game/components/spaceship_exit_rail.dart +++ b/lib/game/components/spaceship_exit_rail.dart @@ -191,6 +191,7 @@ class SpaceshipExitRailEnd extends RampOpening { : super( insideLayer: Layer.spaceshipExitRail, orientation: RampOrientation.down, + insidePriority: 3, ) { renderBody = false; layer = Layer.spaceshipExitRail; diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index e0d25592..dcb740a1 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -22,6 +22,9 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.dashBumper.main.active.keyName), images.load(components.Assets.images.dashBumper.main.inactive.keyName), images.load(Assets.images.components.background.path), + images.load(Assets.images.components.spaceshipRamp.path), + images.load(Assets.images.components.spaceshipRailingBg.path), + images.load(Assets.images.components.spaceshipRailingFg.path), images.load(Assets.images.components.spaceshipDropTube.path), ]); } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 0711e677..095a5f53 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -92,7 +92,9 @@ class PinballGame extends Forge2DGame } Future _addPaths() async { - unawaited(addFromBlueprint(Jetpack())); + unawaited( + addFromBlueprint(Jetpack()), + ); unawaited(addFromBlueprint(Launcher())); } diff --git a/lib/gen/assets.gen.dart b/lib/gen/assets.gen.dart index 2fe23925..7796df34 100644 --- a/lib/gen/assets.gen.dart +++ b/lib/gen/assets.gen.dart @@ -24,6 +24,18 @@ class $AssetsImagesComponentsGen { /// File path: assets/images/components/spaceship-drop-tube.png AssetGenImage get spaceshipDropTube => const AssetGenImage('assets/images/components/spaceship-drop-tube.png'); + + /// File path: assets/images/components/spaceship_railing_bg.png + AssetGenImage get spaceshipRailingBg => + const AssetGenImage('assets/images/components/spaceship_railing_bg.png'); + + /// File path: assets/images/components/spaceship_railing_fg.png + AssetGenImage get spaceshipRailingFg => + const AssetGenImage('assets/images/components/spaceship_railing_fg.png'); + + /// File path: assets/images/components/spaceship_ramp.png + AssetGenImage get spaceshipRamp => + const AssetGenImage('assets/images/components/spaceship_ramp.png'); } class Assets { diff --git a/packages/pinball_components/lib/src/components/spaceship.dart b/packages/pinball_components/lib/src/components/spaceship.dart index 59f1037a..588c0e33 100644 --- a/packages/pinball_components/lib/src/components/spaceship.dart +++ b/packages/pinball_components/lib/src/components/spaceship.dart @@ -185,8 +185,9 @@ class SpaceshipHole extends RampOpening { : super( insideLayer: Layer.spaceship, outsideLayer: outsideLayer, - outsidePriority: outsidePriority, orientation: RampOrientation.up, + insidePriority: 4, + outsidePriority: outsidePriority, ) { renderBody = false; layer = Layer.spaceship; From 0285698e5ca8f27f8bfea1cf3b8cb2016d726d4a Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Fri, 1 Apr 2022 17:25:13 +0100 Subject: [PATCH 7/7] feat(sandbox): made BasicFlipperGame respond to KeyEvents (#123) * feat: made Flippers movable * feat(sanbox): included balls in flipper example * feat: improved moving logic * refactor: removed unused import --- .../sandbox/lib/stories/flipper/basic.dart | 56 +++++++++++++++++-- .../sandbox/lib/stories/flipper/tracing.dart | 17 +----- 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/packages/pinball_components/sandbox/lib/stories/flipper/basic.dart b/packages/pinball_components/sandbox/lib/stories/flipper/basic.dart index 0e5587ea..d31515de 100644 --- a/packages/pinball_components/sandbox/lib/stories/flipper/basic.dart +++ b/packages/pinball_components/sandbox/lib/stories/flipper/basic.dart @@ -1,21 +1,39 @@ -import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame/input.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:pinball_components/pinball_components.dart'; -import 'package:sandbox/common/common.dart'; -class BasicFlipperGame extends BasicGame { +import 'package:sandbox/stories/ball/basic.dart'; + +class BasicFlipperGame extends BasicBallGame with KeyboardEvents { + BasicFlipperGame() : super(color: Colors.blue); + static const info = ''' Basic example of how a Flipper works. '''; + static const _leftFlipperKeys = [ + LogicalKeyboardKey.arrowLeft, + LogicalKeyboardKey.keyA, + ]; + + static const _rightFlipperKeys = [ + LogicalKeyboardKey.arrowRight, + LogicalKeyboardKey.keyD, + ]; + + late Flipper leftFlipper; + late Flipper rightFlipper; + @override Future onLoad() async { await super.onLoad(); final center = screenToWorld(camera.viewport.canvasSize! / 2); - final leftFlipper = Flipper(side: BoardSide.left) + leftFlipper = Flipper(side: BoardSide.left) ..initialPosition = center - Vector2(Flipper.size.x, 0); - final rightFlipper = Flipper(side: BoardSide.right) + rightFlipper = Flipper(side: BoardSide.right) ..initialPosition = center + Vector2(Flipper.size.x, 0); await addAll([ @@ -23,4 +41,32 @@ class BasicFlipperGame extends BasicGame { rightFlipper, ]); } + + @override + KeyEventResult onKeyEvent( + RawKeyEvent event, + Set keysPressed, + ) { + final movedLeftFlipper = _leftFlipperKeys.contains(event.logicalKey); + if (movedLeftFlipper) { + if (event is RawKeyDownEvent) { + leftFlipper.moveUp(); + } else if (event is RawKeyUpEvent) { + leftFlipper.moveDown(); + } + } + + final movedRightFlipper = _rightFlipperKeys.contains(event.logicalKey); + if (movedRightFlipper) { + if (event is RawKeyDownEvent) { + rightFlipper.moveUp(); + } else if (event is RawKeyUpEvent) { + rightFlipper.moveDown(); + } + } + + return movedLeftFlipper || movedRightFlipper + ? KeyEventResult.handled + : KeyEventResult.ignored; + } } diff --git a/packages/pinball_components/sandbox/lib/stories/flipper/tracing.dart b/packages/pinball_components/sandbox/lib/stories/flipper/tracing.dart index d6c5d3df..9b5802f8 100644 --- a/packages/pinball_components/sandbox/lib/stories/flipper/tracing.dart +++ b/packages/pinball_components/sandbox/lib/stories/flipper/tracing.dart @@ -3,10 +3,9 @@ import 'dart:async'; import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/material.dart'; -import 'package:pinball_components/pinball_components.dart'; -import 'package:sandbox/common/common.dart'; +import 'package:sandbox/stories/flipper/basic.dart'; -class FlipperTracingGame extends BasicGame { +class FlipperTracingGame extends BasicFlipperGame { static const info = ''' Basic example of how the Flipper body overlays the sprite. '''; @@ -14,17 +13,6 @@ class FlipperTracingGame extends BasicGame { @override Future onLoad() async { await super.onLoad(); - final center = screenToWorld(camera.viewport.canvasSize! / 2); - - final leftFlipper = Flipper(side: BoardSide.left) - ..initialPosition = center - Vector2(Flipper.size.x, 0); - final rightFlipper = Flipper(side: BoardSide.right) - ..initialPosition = center + Vector2(Flipper.size.x, 0); - - await addAll([ - leftFlipper, - rightFlipper, - ]); leftFlipper.trace(); rightFlipper.trace(); } @@ -37,7 +25,6 @@ extension on BodyComponent { body.joints.whereType().forEach( (joint) => joint.setLimits(0, 0), ); - body.setType(BodyType.static); unawaited( mounted.whenComplete(() {