Skip to content
Snippets Groups Projects
Commit 89a175f4 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Normalize Activity application architecture

parent 940d6f1f
No related branches found
No related tags found
1 merge request!50Resolve "Normalize Activity application architecture"
Pipeline #6671 passed
Showing
with 303 additions and 141 deletions
part of 'game_cubit.dart'; part of 'activity_cubit.dart';
@immutable @immutable
class GameState extends Equatable { class ActivityState extends Equatable {
const GameState({ const ActivityState({
required this.currentGame, required this.currentActivity,
}); });
final Game currentGame; final Activity currentActivity;
@override @override
List<dynamic> get props => <dynamic>[ List<dynamic> get props => <dynamic>[
currentGame, currentActivity,
]; ];
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/config/default_game_settings.dart'; import 'package:minehunter/config/default_activity_settings.dart';
import 'package:minehunter/models/settings/settings_game.dart'; import 'package:minehunter/models/settings/settings_activity.dart';
part 'settings_game_state.dart'; part 'settings_activity_state.dart';
class GameSettingsCubit extends HydratedCubit<GameSettingsState> { class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
GameSettingsCubit() : super(GameSettingsState(settings: GameSettings.createDefault())); ActivitySettingsCubit()
: super(ActivitySettingsState(settings: ActivitySettings.createDefault()));
void setValues({ void setValues({
String? itemsCount, String? itemsCount,
String? timerValue, String? timerValue,
}) { }) {
emit( emit(
GameSettingsState( ActivitySettingsState(
settings: GameSettings( settings: ActivitySettings(
level: itemsCount ?? state.settings.level, level: itemsCount ?? state.settings.level,
size: timerValue ?? state.settings.size, size: timerValue ?? state.settings.size,
), ),
...@@ -25,22 +26,22 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> { ...@@ -25,22 +26,22 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
String getParameterValue(String code) { String getParameterValue(String code) {
switch (code) { switch (code) {
case DefaultGameSettings.parameterCodeLevel: case DefaultActivitySettings.parameterCodeLevel:
return GameSettings.getLevelValueFromUnsafe(state.settings.level); return ActivitySettings.getLevelValueFromUnsafe(state.settings.level);
case DefaultGameSettings.parameterCodeSize: case DefaultActivitySettings.parameterCodeSize:
return GameSettings.getSizeValueFromUnsafe(state.settings.size); return ActivitySettings.getSizeValueFromUnsafe(state.settings.size);
} }
return ''; return '';
} }
void setParameterValue(String code, String value) { void setParameterValue(String code, String value) {
final String itemsCount = code == DefaultGameSettings.parameterCodeLevel final String itemsCount = code == DefaultActivitySettings.parameterCodeLevel
? value ? value
: getParameterValue(DefaultGameSettings.parameterCodeLevel); : getParameterValue(DefaultActivitySettings.parameterCodeLevel);
final String timerValue = code == DefaultGameSettings.parameterCodeSize final String timerValue = code == DefaultActivitySettings.parameterCodeSize
? value ? value
: getParameterValue(DefaultGameSettings.parameterCodeSize); : getParameterValue(DefaultActivitySettings.parameterCodeSize);
setValues( setValues(
itemsCount: itemsCount, itemsCount: itemsCount,
...@@ -49,12 +50,12 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> { ...@@ -49,12 +50,12 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
} }
@override @override
GameSettingsState? fromJson(Map<String, dynamic> json) { ActivitySettingsState? fromJson(Map<String, dynamic> json) {
final String itemsCount = json[DefaultGameSettings.parameterCodeLevel] as String; final String itemsCount = json[DefaultActivitySettings.parameterCodeLevel] as String;
final String timerValue = json[DefaultGameSettings.parameterCodeSize] as String; final String timerValue = json[DefaultActivitySettings.parameterCodeSize] as String;
return GameSettingsState( return ActivitySettingsState(
settings: GameSettings( settings: ActivitySettings(
level: itemsCount, level: itemsCount,
size: timerValue, size: timerValue,
), ),
...@@ -62,10 +63,10 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> { ...@@ -62,10 +63,10 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
} }
@override @override
Map<String, dynamic>? toJson(GameSettingsState state) { Map<String, dynamic>? toJson(ActivitySettingsState state) {
return <String, dynamic>{ return <String, dynamic>{
DefaultGameSettings.parameterCodeLevel: state.settings.level, DefaultActivitySettings.parameterCodeLevel: state.settings.level,
DefaultGameSettings.parameterCodeSize: state.settings.size, DefaultActivitySettings.parameterCodeSize: state.settings.size,
}; };
} }
} }
part of 'settings_game_cubit.dart'; part of 'settings_activity_cubit.dart';
@immutable @immutable
class GameSettingsState extends Equatable { class ActivitySettingsState extends Equatable {
const GameSettingsState({ const ActivitySettingsState({
required this.settings, required this.settings,
}); });
final GameSettings settings; final ActivitySettings settings;
@override @override
List<dynamic> get props => <dynamic>[ List<dynamic> get props => <dynamic>[
......
...@@ -4,11 +4,14 @@ import 'package:flutter/material.dart'; ...@@ -4,11 +4,14 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/common/cubit/nav/nav_cubit_pages.dart';
import 'package:minehunter/common/cubit/nav/nav_cubit_screens.dart';
import 'package:minehunter/config/application_config.dart';
import 'package:minehunter/config/default_global_settings.dart'; import 'package:minehunter/config/default_global_settings.dart';
import 'package:minehunter/cubit/game_cubit.dart'; import 'package:minehunter/cubit/activity/activity_cubit.dart';
import 'package:minehunter/cubit/nav_cubit.dart'; import 'package:minehunter/cubit/settings/settings_activity_cubit.dart';
import 'package:minehunter/cubit/settings_game_cubit.dart'; import 'package:minehunter/cubit/settings/settings_global_cubit.dart';
import 'package:minehunter/cubit/settings_global_cubit.dart';
import 'package:minehunter/ui/skeleton.dart'; import 'package:minehunter/ui/skeleton.dart';
void main() async { void main() async {
...@@ -46,17 +49,30 @@ class MyApp extends StatelessWidget { ...@@ -46,17 +49,30 @@ class MyApp extends StatelessWidget {
return MultiBlocProvider( return MultiBlocProvider(
providers: [ providers: [
BlocProvider<NavCubit>(create: (context) => NavCubit()), // default providers
BlocProvider<NavCubitPage>(
create: (context) => NavCubitPage(),
),
BlocProvider<NavCubitScreen>(
create: (context) => NavCubitScreen(),
),
BlocProvider<ApplicationThemeModeCubit>( BlocProvider<ApplicationThemeModeCubit>(
create: (context) => ApplicationThemeModeCubit()), create: (context) => ApplicationThemeModeCubit(),
BlocProvider<GameCubit>(create: (context) => GameCubit()), ),
BlocProvider<GlobalSettingsCubit>(create: (context) => GlobalSettingsCubit()), BlocProvider<ActivityCubit>(
BlocProvider<GameSettingsCubit>(create: (context) => GameSettingsCubit()), create: (context) => ActivityCubit(),
),
BlocProvider<GlobalSettingsCubit>(
create: (context) => GlobalSettingsCubit(),
),
BlocProvider<ActivitySettingsCubit>(
create: (context) => ActivitySettingsCubit(),
),
], ],
child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>( child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>(
builder: (BuildContext context, ApplicationThemeModeState state) { builder: (BuildContext context, ApplicationThemeModeState state) {
return MaterialApp( return MaterialApp(
title: 'Minehunter', title: ApplicationConfig.appTitle,
home: const SkeletonScreen(), home: const SkeletonScreen(),
// Theme stuff // Theme stuff
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/config/default_game_settings.dart'; import 'package:minehunter/config/default_activity_settings.dart';
import 'package:minehunter/models/game/cell.dart'; import 'package:minehunter/models/activity/cell.dart';
import 'package:minehunter/models/settings/settings_game.dart'; import 'package:minehunter/models/settings/settings_activity.dart';
import 'package:minehunter/models/settings/settings_global.dart'; import 'package:minehunter/models/settings/settings_global.dart';
import 'package:minehunter/models/types.dart'; import 'package:minehunter/models/types.dart';
class Game { class Activity {
Game({ Activity({
// Settings // Settings
required this.gameSettings, required this.activitySettings,
required this.globalSettings, required this.globalSettings,
// State // State
...@@ -32,7 +32,7 @@ class Game { ...@@ -32,7 +32,7 @@ class Game {
}); });
// Settings // Settings
final GameSettings gameSettings; final ActivitySettings activitySettings;
final GlobalSettings globalSettings; final GlobalSettings globalSettings;
// State // State
...@@ -53,10 +53,10 @@ class Game { ...@@ -53,10 +53,10 @@ class Game {
bool gameWin; bool gameWin;
bool gameFail; bool gameFail;
factory Game.createEmpty() { factory Activity.createEmpty() {
return Game( return Activity(
// Settings // Settings
gameSettings: GameSettings.createDefault(), activitySettings: ActivitySettings.createDefault(),
globalSettings: GlobalSettings.createDefault(), globalSettings: GlobalSettings.createDefault(),
// Base data // Base data
board: [], board: [],
...@@ -65,15 +65,16 @@ class Game { ...@@ -65,15 +65,16 @@ class Game {
); );
} }
factory Game.createNew({ factory Activity.createNew({
GameSettings? gameSettings, ActivitySettings? activitySettings,
GlobalSettings? globalSettings, GlobalSettings? globalSettings,
}) { }) {
final GameSettings newGameSettings = gameSettings ?? GameSettings.createDefault(); final ActivitySettings newActivitySettings =
activitySettings ?? ActivitySettings.createDefault();
final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault(); final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();
final int sizeHorizontal = int.parse(newGameSettings.size.split('x')[0]); final int sizeHorizontal = int.parse(newActivitySettings.size.split('x')[0]);
final int sizeVertical = int.parse(newGameSettings.size.split('x')[1]); final int sizeVertical = int.parse(newActivitySettings.size.split('x')[1]);
// Create empty board (it will be mined after first hit) // Create empty board (it will be mined after first hit)
final Board board = []; final Board board = [];
...@@ -86,13 +87,13 @@ class Game { ...@@ -86,13 +87,13 @@ class Game {
} }
final int minesCountRatio = final int minesCountRatio =
DefaultGameSettings.minesCountRatios[newGameSettings.level] ?? 1; DefaultActivitySettings.minesCountRatios[newActivitySettings.level] ?? 1;
final int minesCount = ((sizeHorizontal * sizeVertical) * minesCountRatio / 100).round(); final int minesCount = ((sizeHorizontal * sizeVertical) * minesCountRatio / 100).round();
printlog('Mines count: $minesCount'); printlog('Mines count: $minesCount');
return Game( return Activity(
// Settings // Settings
gameSettings: newGameSettings, activitySettings: newActivitySettings,
globalSettings: newGlobalSettings, globalSettings: newGlobalSettings,
// State // State
isRunning: true, isRunning: true,
...@@ -176,9 +177,9 @@ class Game { ...@@ -176,9 +177,9 @@ class Game {
printlog(''); printlog('');
printlog('## Current game dump:'); printlog('## Current game dump:');
printlog(''); printlog('');
printlog('$Game:'); printlog('$Activity:');
printlog(' Settings'); printlog(' Settings');
gameSettings.dump(); activitySettings.dump();
globalSettings.dump(); globalSettings.dump();
printlog(' State'); printlog(' State');
printlog(' isRunning: $isRunning'); printlog(' isRunning: $isRunning');
...@@ -240,13 +241,13 @@ class Game { ...@@ -240,13 +241,13 @@ class Game {
@override @override
String toString() { String toString() {
return '$Game(${toJson()})'; return '$Activity(${toJson()})';
} }
Map<String, dynamic>? toJson() { Map<String, dynamic>? toJson() {
return <String, dynamic>{ return <String, dynamic>{
// Settings // Settings
'gameSettings': gameSettings.toJson(), 'activitySettings': activitySettings.toJson(),
'globalSettings': globalSettings.toJson(), 'globalSettings': globalSettings.toJson(),
// State // State
'isRunning': isRunning, 'isRunning': isRunning,
......
File moved
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/config/default_game_settings.dart'; import 'package:minehunter/config/default_activity_settings.dart';
class GameSettings { class ActivitySettings {
final String level; final String level;
final String size; final String size;
GameSettings({ ActivitySettings({
required this.level, required this.level,
required this.size, required this.size,
}); });
static String getLevelValueFromUnsafe(String level) { static String getLevelValueFromUnsafe(String level) {
if (DefaultGameSettings.allowedLevelValues.contains(level)) { if (DefaultActivitySettings.allowedLevelValues.contains(level)) {
return level; return level;
} }
return DefaultGameSettings.defaultLevelValue; return DefaultActivitySettings.defaultLevelValue;
} }
static String getSizeValueFromUnsafe(String size) { static String getSizeValueFromUnsafe(String size) {
if (DefaultGameSettings.allowedSizeValues.contains(size)) { if (DefaultActivitySettings.allowedSizeValues.contains(size)) {
return size; return size;
} }
return DefaultGameSettings.defaultSizeValue; return DefaultActivitySettings.defaultSizeValue;
} }
factory GameSettings.createDefault() { factory ActivitySettings.createDefault() {
return GameSettings( return ActivitySettings(
level: DefaultGameSettings.defaultLevelValue, level: DefaultActivitySettings.defaultLevelValue,
size: DefaultGameSettings.defaultSizeValue, size: DefaultActivitySettings.defaultSizeValue,
); );
} }
void dump() { void dump() {
printlog('$GameSettings:'); printlog('$ActivitySettings:');
printlog(' ${DefaultGameSettings.parameterCodeLevel}: $level'); printlog(' ${DefaultActivitySettings.parameterCodeLevel}: $level');
printlog(' ${DefaultGameSettings.parameterCodeSize}: $size'); printlog(' ${DefaultActivitySettings.parameterCodeSize}: $size');
printlog(''); printlog('');
} }
@override @override
String toString() { String toString() {
return '$GameSettings(${toJson()})'; return '$ActivitySettings(${toJson()})';
} }
Map<String, dynamic>? toJson() { Map<String, dynamic>? toJson() {
return <String, dynamic>{ return <String, dynamic>{
DefaultGameSettings.parameterCodeLevel: level, DefaultActivitySettings.parameterCodeLevel: level,
DefaultGameSettings.parameterCodeSize: size, DefaultActivitySettings.parameterCodeSize: size,
}; };
} }
} }
import 'package:minehunter/models/game/cell.dart'; import 'package:minehunter/models/activity/cell.dart';
typedef Board = List<List<Cell>>; typedef Board = List<List<Cell>>;
typedef AnimatedBoard = List<List<bool>>; typedef AnimatedBoard = List<List<bool>>;
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/cubit/game_cubit.dart'; import 'package:minehunter/cubit/activity/activity_cubit.dart';
import 'package:minehunter/models/game/game.dart'; import 'package:minehunter/models/activity/activity.dart';
import 'package:minehunter/ui/widgets/game/mode_toggle.dart'; import 'package:minehunter/ui/widgets/game/mode_toggle.dart';
class GameBottomWidget extends StatelessWidget { class GameBottomWidget extends StatelessWidget {
...@@ -10,11 +10,11 @@ class GameBottomWidget extends StatelessWidget { ...@@ -10,11 +10,11 @@ class GameBottomWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<GameCubit, GameState>( return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, GameState gameState) { builder: (BuildContext context, ActivityState activityState) {
final Game currentGame = gameState.currentGame; final Activity currentActivity = activityState.currentActivity;
return !currentGame.isFinished ? const ToggleGameMode() : const SizedBox.shrink(); return !currentActivity.isFinished ? const ToggleGameMode() : const SizedBox.shrink();
}, },
); );
} }
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/cubit/game_cubit.dart'; import 'package:minehunter/cubit/activity/activity_cubit.dart';
import 'package:minehunter/models/game/game.dart'; import 'package:minehunter/models/activity/activity.dart';
import 'package:minehunter/ui/widgets/actions/button_game_quit.dart'; import 'package:minehunter/ui/widgets/actions/button_game_quit.dart';
class GameEndWidget extends StatelessWidget { class GameEndWidget extends StatelessWidget {
...@@ -10,14 +10,14 @@ class GameEndWidget extends StatelessWidget { ...@@ -10,14 +10,14 @@ class GameEndWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<GameCubit, GameState>( return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, GameState gameState) { builder: (BuildContext context, ActivityState activityState) {
final Game currentGame = gameState.currentGame; final Activity currentActivity = activityState.currentActivity;
final Image decorationImage = Image( final Image decorationImage = Image(
image: AssetImage(currentGame.gameWin image: AssetImage(currentActivity.gameWin
? 'assets/ui/game_win.png' ? 'assets/ui/game_win.png'
: currentGame.gameFail : currentActivity.gameFail
? 'assets/ui/game_fail.png' ? 'assets/ui/game_fail.png'
: ''), : ''),
fit: BoxFit.fill, fit: BoxFit.fill,
...@@ -37,7 +37,7 @@ class GameEndWidget extends StatelessWidget { ...@@ -37,7 +37,7 @@ class GameEndWidget extends StatelessWidget {
), ),
Column( Column(
children: [ children: [
currentGame.animationInProgress currentActivity.animationInProgress
? decorationImage ? decorationImage
: const QuitGameButton() : const QuitGameButton()
], ],
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/cubit/game_cubit.dart';
import 'package:minehunter/models/game/game.dart';
import 'package:minehunter/ui/layouts/game_layout.dart';
import 'package:minehunter/ui/layouts/parameters_layout.dart';
class PageGame extends StatelessWidget {
const PageGame({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<GameCubit, GameState>(
builder: (BuildContext context, GameState gameState) {
final Game currentGame = gameState.currentGame;
return currentGame.isRunning
? const GameLayout()
: ParametersLayout(canResume: currentGame.canBeResumed);
},
);
}
}
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/config/menu.dart'; import 'package:minehunter/common/config/activity_page.dart';
import 'package:minehunter/cubit/nav_cubit.dart'; import 'package:minehunter/common/config/screen.dart';
import 'package:minehunter/ui/widgets/global_app_bar.dart'; import 'package:minehunter/common/cubit/nav/nav_cubit_screens.dart';
import 'package:minehunter/common/ui/nav/global_app_bar.dart';
import 'package:minehunter/common/ui/nav/bottom_nav_bar.dart';
class SkeletonScreen extends StatelessWidget { class SkeletonScreen extends StatelessWidget {
const SkeletonScreen({super.key}); const SkeletonScreen({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<NavCubitScreen, int>(
builder: (BuildContext context, int screenIndex) {
return Scaffold( return Scaffold(
appBar: const GlobalAppBar(), appBar: const GlobalAppBar(),
extendBodyBehindAppBar: false, extendBodyBehindAppBar: false,
body: Material( body: Material(
color: Theme.of(context).colorScheme.surface, color: Theme.of(context).colorScheme.surface,
child: BlocBuilder<NavCubit, int>( child: Padding(
builder: (BuildContext context, int pageIndex) {
return Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
top: 8, top: 8,
left: 2, left: 2,
right: 2, right: 2,
), ),
child: Menu.getPageWidget(pageIndex), child: Screen.getWidget(screenIndex),
);
},
), ),
), ),
backgroundColor: Theme.of(context).colorScheme.surface, backgroundColor: Theme.of(context).colorScheme.surface,
bottomNavigationBar: ActivityPage.displayBottomNavBar ? const BottomNavBar() : null,
);
},
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/cubit/game_cubit.dart'; import 'package:minehunter/cubit/activity/activity_cubit.dart';
class DeleteSavedGameButton extends StatelessWidget { class DeleteSavedGameButton extends StatelessWidget {
const DeleteSavedGameButton({super.key}); const DeleteSavedGameButton({super.key});
...@@ -11,7 +11,7 @@ class DeleteSavedGameButton extends StatelessWidget { ...@@ -11,7 +11,7 @@ class DeleteSavedGameButton extends StatelessWidget {
return StyledButton( return StyledButton(
color: Colors.grey, color: Colors.grey,
onPressed: () { onPressed: () {
BlocProvider.of<GameCubit>(context).deleteSavedGame(); BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
}, },
child: const Image( child: const Image(
image: AssetImage('assets/ui/button_delete_saved_game.png'), image: AssetImage('assets/ui/button_delete_saved_game.png'),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/cubit/game_cubit.dart'; import 'package:minehunter/common/cubit/nav/nav_cubit_pages.dart';
import 'package:minehunter/cubit/activity/activity_cubit.dart';
class QuitGameButton extends StatelessWidget { class QuitGameButton extends StatelessWidget {
const QuitGameButton({super.key}); const QuitGameButton({super.key});
...@@ -11,7 +13,8 @@ class QuitGameButton extends StatelessWidget { ...@@ -11,7 +13,8 @@ class QuitGameButton extends StatelessWidget {
return StyledButton( return StyledButton(
color: Colors.red, color: Colors.red,
onPressed: () { onPressed: () {
BlocProvider.of<GameCubit>(context).quitGame(); BlocProvider.of<ActivityCubit>(context).quitActivity();
BlocProvider.of<NavCubitPage>(context).goToPageHome();
}, },
child: const Image( child: const Image(
image: AssetImage('assets/ui/button_back.png'), image: AssetImage('assets/ui/button_back.png'),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/cubit/game_cubit.dart'; import 'package:minehunter/common/cubit/nav/nav_cubit_pages.dart';
import 'package:minehunter/cubit/settings_game_cubit.dart';
import 'package:minehunter/cubit/settings_global_cubit.dart'; import 'package:minehunter/cubit/activity/activity_cubit.dart';
import 'package:minehunter/cubit/settings/settings_activity_cubit.dart';
import 'package:minehunter/cubit/settings/settings_global_cubit.dart';
class StartNewGameButton extends StatelessWidget { class StartNewGameButton extends StatelessWidget {
const StartNewGameButton({super.key}); const StartNewGameButton({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<GameSettingsCubit, GameSettingsState>( return BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>(
builder: (BuildContext context, GameSettingsState gameSettingsState) { builder: (BuildContext context, ActivitySettingsState activitySettingsState) {
return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>( return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
builder: (BuildContext context, GlobalSettingsState globalSettingsState) { builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
return StyledButton( return StyledButton(
color: Colors.blue, color: Colors.blue,
onPressed: () { onPressed: () {
BlocProvider.of<GameCubit>(context).startNewGame( BlocProvider.of<ActivityCubit>(context).startNewActivity(
gameSettings: gameSettingsState.settings, activitySettings: activitySettingsState.settings,
globalSettings: globalSettingsState.settings, globalSettings: globalSettingsState.settings,
); );
BlocProvider.of<NavCubitPage>(context).goToPageGame();
}, },
child: const Image( child: const Image(
image: AssetImage('assets/ui/button_start.png'), image: AssetImage('assets/ui/button_start.png'),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/cubit/game_cubit.dart'; import 'package:minehunter/common/cubit/nav/nav_cubit_pages.dart';
import 'package:minehunter/cubit/activity/activity_cubit.dart';
class ResumeSavedGameButton extends StatelessWidget { class ResumeSavedGameButton extends StatelessWidget {
const ResumeSavedGameButton({super.key}); const ResumeSavedGameButton({super.key});
...@@ -11,7 +13,8 @@ class ResumeSavedGameButton extends StatelessWidget { ...@@ -11,7 +13,8 @@ class ResumeSavedGameButton extends StatelessWidget {
return StyledButton( return StyledButton(
color: Colors.blue, color: Colors.blue,
onPressed: () { onPressed: () {
BlocProvider.of<GameCubit>(context).resumeSavedGame(); BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
BlocProvider.of<NavCubitPage>(context).goToPageGame();
}, },
child: const Image( child: const Image(
image: AssetImage('assets/ui/button_resume_game.png'), image: AssetImage('assets/ui/button_resume_game.png'),
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/cubit/game_cubit.dart'; import 'package:minehunter/cubit/activity/activity_cubit.dart';
import 'package:minehunter/models/game/cell.dart'; import 'package:minehunter/models/activity/cell.dart';
import 'package:minehunter/models/game/game.dart'; import 'package:minehunter/models/activity/activity.dart';
import 'package:minehunter/utils/board_animate.dart'; import 'package:minehunter/utils/board_animate.dart';
class CellWidget extends StatelessWidget { class CellWidget extends StatelessWidget {
...@@ -20,20 +20,20 @@ class CellWidget extends StatelessWidget { ...@@ -20,20 +20,20 @@ class CellWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<GameCubit, GameState>( return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, GameState gameState) { builder: (BuildContext context, ActivityState activityState) {
final Game currentGame = gameState.currentGame; final Activity currentActivity = activityState.currentActivity;
final GameCubit gameCubit = BlocProvider.of<GameCubit>(context); final ActivityCubit activityCubit = BlocProvider.of<ActivityCubit>(context);
String imageAsset = getImageAssetName( String imageAsset = getImageAssetName(
currentGame: currentGame, currentActivity: currentActivity,
); );
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: getBackgroundColor(currentGame), color: getBackgroundColor(currentActivity),
border: getCellBorders( border: getCellBorders(
currentGame: currentGame, currentActivity: currentActivity,
row: row, row: row,
col: col, col: col,
), ),
...@@ -52,28 +52,28 @@ class CellWidget extends StatelessWidget { ...@@ -52,28 +52,28 @@ class CellWidget extends StatelessWidget {
), ),
onTap: () { onTap: () {
// Set mines on board after first player try // Set mines on board after first player try
if (!currentGame.isBoardMined) { if (!currentActivity.isBoardMined) {
gameCubit.addMines(forbiddenRow: row, forbiddenCol: col); activityCubit.addMines(forbiddenRow: row, forbiddenCol: col);
} }
if (!(currentGame.gameWin || currentGame.gameFail)) { if (!(currentActivity.gameWin || currentActivity.gameFail)) {
if (currentGame.reportMode) { if (currentActivity.reportMode) {
gameCubit.reportCell( activityCubit.reportCell(
row: row, row: row,
col: col, col: col,
); );
} else { } else {
gameCubit.walkOnCell( activityCubit.walkOnCell(
row: row, row: row,
col: col, col: col,
); );
} }
if (gameCubit.checkGameIsFinished()) { if (activityCubit.checkGameIsFinished()) {
gameCubit.updateReportMode(false); activityCubit.updateReportMode(false);
BoardAnimate.startAnimation( BoardAnimate.startAnimation(
gameCubit: gameCubit, activityCubit: activityCubit,
currentGame: currentGame, currentActivity: currentActivity,
animationType: currentGame.gameWin ? 'win' : 'fail', animationType: currentActivity.gameWin ? 'win' : 'fail',
); );
} }
} }
...@@ -88,13 +88,13 @@ class CellWidget extends StatelessWidget { ...@@ -88,13 +88,13 @@ class CellWidget extends StatelessWidget {
* Compute image asset name, from skin and cell value/state * Compute image asset name, from skin and cell value/state
*/ */
String getImageAssetName({ String getImageAssetName({
required Game currentGame, required Activity currentActivity,
}) { }) {
final String skin = currentGame.globalSettings.skin; final String skin = currentActivity.globalSettings.skin;
String imageAsset = 'assets/skins/${skin}_tile_unknown.png'; String imageAsset = 'assets/skins/${skin}_tile_unknown.png';
bool showSolution = currentGame.gameWin || currentGame.gameFail; bool showSolution = currentActivity.gameWin || currentActivity.gameFail;
if (!showSolution) { if (!showSolution) {
// Running game // Running game
if (cell.isExplored) { if (cell.isExplored) {
...@@ -131,11 +131,11 @@ class CellWidget extends StatelessWidget { ...@@ -131,11 +131,11 @@ class CellWidget extends StatelessWidget {
} }
// Compute cell background color, from cell state // Compute cell background color, from cell state
Color getBackgroundColor(currentGame) { Color getBackgroundColor(Activity currentActivity) {
if (currentGame.gameWin) { if (currentActivity.gameWin) {
return cell.isAnimated ? Colors.green.shade400 : Colors.green.shade500; return cell.isAnimated ? Colors.green.shade400 : Colors.green.shade500;
} }
if (currentGame.gameFail) { if (currentActivity.gameFail) {
return cell.isAnimated ? Colors.pink.shade200 : Colors.pink.shade400; return cell.isAnimated ? Colors.pink.shade200 : Colors.pink.shade400;
} }
...@@ -144,7 +144,7 @@ class CellWidget extends StatelessWidget { ...@@ -144,7 +144,7 @@ class CellWidget extends StatelessWidget {
// Compute cell borders, from board size and cell state // Compute cell borders, from board size and cell state
Border getCellBorders({ Border getCellBorders({
required Game currentGame, required Activity currentActivity,
required int row, required int row,
required int col, required int col,
}) { }) {
...@@ -152,7 +152,7 @@ class CellWidget extends StatelessWidget { ...@@ -152,7 +152,7 @@ class CellWidget extends StatelessWidget {
double cellBorderWidth = 4; double cellBorderWidth = 4;
// Reduce cell border width on big boards // Reduce cell border width on big boards
int boardSize = currentGame.sizeHorizontal; int boardSize = currentActivity.sizeHorizontal;
if (boardSize > 8) { if (boardSize > 8) {
cellBorderWidth = 2; cellBorderWidth = 2;
if (boardSize > 10) { if (boardSize > 10) {
...@@ -160,9 +160,9 @@ class CellWidget extends StatelessWidget { ...@@ -160,9 +160,9 @@ class CellWidget extends StatelessWidget {
} }
} }
if (currentGame.gameWin) { if (currentActivity.gameWin) {
cellBorderColor = Colors.green.shade700; cellBorderColor = Colors.green.shade700;
} else if (currentGame.gameFail) { } else if (currentActivity.gameFail) {
cellBorderColor = Colors.pink.shade300; cellBorderColor = Colors.pink.shade300;
} }
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:minehunter/cubit/game_cubit.dart'; import 'package:minehunter/cubit/activity/activity_cubit.dart';
import 'package:minehunter/models/game/game.dart'; import 'package:minehunter/models/activity/activity.dart';
import 'package:minehunter/models/types.dart'; import 'package:minehunter/models/types.dart';
import 'package:minehunter/ui/widgets/game/cell.dart'; import 'package:minehunter/ui/widgets/game/cell.dart';
...@@ -11,12 +11,12 @@ class GameBoardWidget extends StatelessWidget { ...@@ -11,12 +11,12 @@ class GameBoardWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<GameCubit, GameState>( return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, GameState gameState) { builder: (BuildContext context, ActivityState activityState) {
final Game currentGame = gameState.currentGame; final Activity currentActivity = activityState.currentActivity;
final Board board = currentGame.board; final Board board = currentActivity.board;
final Color borderColor = currentGame.reportMode ? Colors.blue : Colors.black; final Color borderColor = currentActivity.reportMode ? Colors.blue : Colors.black;
return Container( return Container(
margin: const EdgeInsets.all(2), margin: const EdgeInsets.all(2),
...@@ -35,10 +35,10 @@ class GameBoardWidget extends StatelessWidget { ...@@ -35,10 +35,10 @@ class GameBoardWidget extends StatelessWidget {
child: Table( child: Table(
defaultColumnWidth: const IntrinsicColumnWidth(), defaultColumnWidth: const IntrinsicColumnWidth(),
children: [ children: [
for (int row = 0; row < currentGame.sizeVertical; row++) for (int row = 0; row < currentActivity.sizeVertical; row++)
TableRow( TableRow(
children: [ children: [
for (int col = 0; col < currentGame.sizeHorizontal; col++) for (int col = 0; col < currentActivity.sizeHorizontal; col++)
Column( Column(
children: [ children: [
CellWidget(cell: board[row][col], row: row, col: col) CellWidget(cell: board[row][col], row: row, col: col)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment