diff --git a/android/gradle.properties b/android/gradle.properties index 957c40bc42f3a742d2266dc3a403ad014458ba3f..777ac2de0980e935649cf32bd85097eaf789185a 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true -app.versionName=0.0.15 -app.versionCode=15 +app.versionName=0.0.16 +app.versionCode=16 diff --git a/fastlane/metadata/android/en-US/changelogs/16.txt b/fastlane/metadata/android/en-US/changelogs/16.txt new file mode 100644 index 0000000000000000000000000000000000000000..e6781f42a141379f096b08fceccd6c7db81f286c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/16.txt @@ -0,0 +1 @@ +Display current positions. diff --git a/fastlane/metadata/android/fr-FR/changelogs/16.txt b/fastlane/metadata/android/fr-FR/changelogs/16.txt new file mode 100644 index 0000000000000000000000000000000000000000..76111aa31850c6ee871406091a341361e37de9e1 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/16.txt @@ -0,0 +1 @@ +Affiche les positions en cours. diff --git a/lib/cubit/game_cubit.dart b/lib/cubit/game_cubit.dart index ddc7353f6e2f25cd92448993e0c26e599e1c4efb..cb60df2816e158ce188321e330f45f99f95e30ff 100644 --- a/lib/cubit/game_cubit.dart +++ b/lib/cubit/game_cubit.dart @@ -16,8 +16,21 @@ class GameCubit extends HydratedCubit<GameState> { void setValues({ Move? move, }) { + List<Move> history = state.history ?? []; + if (move != null) { + history.add(move); + } + emit(GameState( move: move ?? state.move, + history: history, + )); + } + + void deleteHistory() { + emit(GameState( + move: state.move, + history: [], )); } diff --git a/lib/cubit/game_state.dart b/lib/cubit/game_state.dart index f859fd5aebc6f5c645398506e55de63a5a5f461f..204801effc156a3a761d130cfe37bcd50f81aa47 100644 --- a/lib/cubit/game_state.dart +++ b/lib/cubit/game_state.dart @@ -4,16 +4,20 @@ part of 'game_cubit.dart'; class GameState extends Equatable { const GameState({ this.move, + this.history, }); final Move? move; + final List<Move>? history; @override List<dynamic> get props => <dynamic>[ move, + history, ]; Map<String, dynamic> get values => <String, dynamic>{ 'move': move, + 'history': history, }; } diff --git a/lib/models/move.dart b/lib/models/move.dart index 24b4fcb06477c9633e0c361b40b4cd9dc5a4016f..7987bbe9fc94ff2ea1ea04b71dff2f888ca763b5 100644 --- a/lib/models/move.dart +++ b/lib/models/move.dart @@ -18,6 +18,13 @@ class Move { ); } + factory Move.createFrom({TwisterMember? member, TwisterColor? color}) { + return Move( + color: color, + member: member, + ); + } + factory Move.pickRandom() { return Move( color: TwisterColor.pickRandom(), diff --git a/lib/ui/widgets/game.dart b/lib/ui/widgets/game.dart index 5019d58fa87f585a93a2df99193c552821bbc67b..b6ac6a95b5acd7c06529794d36c798f46cf90298 100644 --- a/lib/ui/widgets/game.dart +++ b/lib/ui/widgets/game.dart @@ -7,6 +7,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:twister/cubit/game_cubit.dart'; import 'package:twister/models/move.dart'; +import 'package:twister/models/twister_color.dart'; +import 'package:twister/models/twister_member.dart'; import 'package:twister/ui/widgets/show_move.dart'; class Game extends StatefulWidget { @@ -64,20 +66,92 @@ class _GameState extends State<Game> { player.play(AssetSource(newMove.toSoundAsset())); } + Widget buildCurrentStateWidget(List<Move>? history) { + Map<String, TwisterColor?> currentState = {}; + + history?.forEach((move) { + currentState[move.member.toString()] = move.color; + }); + + TwisterMember leftHand = TwisterMember(value: TwisterAllowedMembers.leftHand); + TwisterMember rightHand = TwisterMember(value: TwisterAllowedMembers.rightHand); + TwisterMember leftFoot = TwisterMember(value: TwisterAllowedMembers.leftFoot); + TwisterMember rightFoot = TwisterMember(value: TwisterAllowedMembers.rightFoot); + + Move leftHandMove = Move.createFrom( + member: leftHand, + color: currentState[leftHand.toString()], + ); + Move rightHandMove = Move.createFrom( + member: rightHand, + color: currentState[rightHand.toString()], + ); + Move leftFootMove = Move.createFrom( + member: leftFoot, + color: currentState[leftFoot.toString()], + ); + Move rightFootMove = Move.createFrom( + member: rightFoot, + color: currentState[rightFoot.toString()], + ); + + return Padding( + padding: EdgeInsets.all(30), + child: Table( + children: [ + TableRow( + children: [ + Padding( + padding: EdgeInsets.all(10), + child: ShowMove(move: leftHandMove), + ), + Padding( + padding: EdgeInsets.all(10), + child: ShowMove(move: rightHandMove), + ), + ], + ), + TableRow( + children: [ + Padding( + padding: EdgeInsets.all(10), + child: ShowMove(move: leftFootMove), + ), + Padding( + padding: EdgeInsets.all(10), + child: ShowMove(move: rightFootMove), + ), + ], + ) + ], + ), + ); + } + @override Widget build(BuildContext context) { return BlocBuilder<GameCubit, GameState>( builder: (BuildContext context, GameState gameState) { - return GestureDetector( - child: shuffling - ? Transform.rotate( - angle: 2 * pi * Random().nextDouble(), - child: ShowMove(move: shuffledMove ?? Move.createNull()), - ) - : ShowMove(move: gameState.move ?? Move.createNull()), - onTap: () { - animate(); - }, + return Column( + children: [ + GestureDetector( + child: shuffling + ? Transform.rotate( + angle: 2 * pi * Random().nextDouble(), + child: ShowMove(move: shuffledMove ?? Move.createNull()), + ) + : ShowMove(move: gameState.move ?? Move.createNull()), + onTap: () { + animate(); + }, + ), + GestureDetector( + child: buildCurrentStateWidget(gameState.history), + onTap: () { + BlocProvider.of<GameCubit>(context).deleteHistory(); + }, + ), + ], ); }, ); diff --git a/pubspec.yaml b/pubspec.yaml index a2627490a05b5fff73982c4397cf90dbc14d1928..b40b5b8add1f86cfa2d02bc9974c325bf25afc7a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: twister game companion publish_to: 'none' -version: 0.0.15+15 +version: 0.0.16+16 environment: sdk: '^3.0.0'