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

Normalize game architecture

parent 4b944918
Branches
Tags
1 merge request!27Resolve "Normalize game architecture"
Pipeline #5695 passed
Showing
with 115 additions and 83 deletions
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=0.0.26 app.versionName=0.1.0
app.versionCode=26 app.versionCode=27
{ {
"app_name": "Sort Game", "app_name": "Sort Game",
"bottom_nav_home": "Game",
"bottom_nav_settings": "Settings",
"bottom_nav_about": "About",
"settings_title": "Settings", "settings_title": "Settings",
"settings_label_theme": "Theme mode", "settings_label_theme": "Theme mode",
"about_title": "About", "about_title": "About",
"about_content": "Sort game, simple and classic.", "about_content": "Sort game, simple and classic.",
"about_version": "Version: {version}" "about_version": "Version: {version}",
"": ""
} }
{ {
"app_name": "SortGame", "app_name": "Jeu de tri",
"bottom_nav_home": "Jeu",
"bottom_nav_settings": "Réglages",
"bottom_nav_about": "Infos",
"settings_title": "Réglages", "settings_title": "Réglages",
"settings_label_theme": "Thème de couleurs", "settings_label_theme": "Thème de couleurs",
"about_title": "Informations", "about_title": "Informations",
"about_content": "Jeu de tri.", "about_content": "Jeu de tri.",
"about_version": "Version : {version}" "about_version": "Version : {version}",
"": ""
} }
File moved
assets/ui/button_delete_saved_game.png

5.68 KiB

assets/ui/button_resume_game.png

3.57 KiB

File moved
assets/ui/game_fail.png

3.56 KiB

assets/ui/game_win.png

7.75 KiB

File moved
Improve/normalize game architecture.
Amélioration/normalisation de l'architecture du jeu.
...@@ -4,38 +4,46 @@ import 'package:sortgame/utils/tools.dart'; ...@@ -4,38 +4,46 @@ import 'package:sortgame/utils/tools.dart';
class DefaultGameSettings { class DefaultGameSettings {
// available game parameters codes // available game parameters codes
static const String parameterCodeItemsCount = 'itemsCount'; static const String parameterCodeItemsCount = 'itemsCount';
static const String parameterCodeThemeIndex = 'theme'; static const String parameterCodeThemeCode = 'themeCode';
static const List<String> availableParameters = [ static const List<String> availableParameters = [
parameterCodeItemsCount, parameterCodeItemsCount,
parameterCodeThemeIndex, parameterCodeThemeCode,
]; ];
// items count: available values // items count: available values
static const int itemsCountValueLow = 5; static const String itemsCountValueLow = '5';
static const int itemsCountValueMedium = 10; static const String itemsCountValueMedium = '10';
static const int itemsCountValueHigh = 15; static const String itemsCountValueHigh = '15';
static const int itemsCountValueVeryHigh = 20; static const String itemsCountValueVeryHigh = '20';
static const List<int> allowedItemsCountValues = [ static const List<String> allowedItemsCountValues = [
itemsCountValueLow, itemsCountValueLow,
itemsCountValueMedium, itemsCountValueMedium,
itemsCountValueHigh, itemsCountValueHigh,
itemsCountValueVeryHigh, itemsCountValueVeryHigh,
]; ];
// items count: default value // items count: default value
static const int defaultItemsCountValue = itemsCountValueMedium; static const String defaultItemsCountValue = itemsCountValueMedium;
static const int defaultThemeValue = 0; // theme code: available values
static List<String> allowedThemeCodeValues = FetchDataHelper().getThemesCodes();
// theme code: default value
static const String defaultThemeCodeValue = '';
static List<int> getAvailableValues(String parameterCode) { // available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) { switch (parameterCode) {
case 'itemsCount': case parameterCodeItemsCount:
return DefaultGameSettings.allowedItemsCountValues; return DefaultGameSettings.allowedItemsCountValues;
case 'theme': case parameterCodeThemeCode:
final int count = FetchDataHelper().getThemes().length; return DefaultGameSettings.allowedThemeCodeValues;
return List<int>.generate(count, (i) => i);
} }
printlog('Did not find any available value for game parameter "$parameterCode".'); printlog('Did not find any available value for game parameter "$parameterCode".');
return []; return [];
} }
// parameters displayed with assets (instead of painter)
static List<String> displayedWithAssets = [
//
];
} }
import 'package:sortgame/utils/tools.dart'; import 'package:sortgame/utils/tools.dart';
class DefaultGlobalSettings { class DefaultGlobalSettings {
static const List<String> availableParameters = []; // available global parameters codes
static const String parameterCodeSkin = 'skin';
static const List<String> availableParameters = [
parameterCodeSkin,
];
// skin: available values
static const String skinValueDefault = 'default';
static const List<String> allowedSkinValues = [
skinValueDefault,
];
// skin: default value
static const String defaultSkinValue = skinValueDefault;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodeSkin:
return DefaultGlobalSettings.allowedSkinValues;
}
static List<int> getAvailableValues(String parameterCode) {
printlog('Did not find any available value for global parameter "$parameterCode".'); printlog('Did not find any available value for global parameter "$parameterCode".');
return []; return [];
} }
// parameters displayed with assets (instead of painter)
static List<String> displayedWithAssets = [
//
];
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:unicons/unicons.dart';
import 'package:sortgame/ui/screens/page_about.dart'; import 'package:sortgame/ui/screens/page_about.dart';
import 'package:sortgame/ui/screens/page_game.dart'; import 'package:sortgame/ui/screens/page_game.dart';
import 'package:sortgame/ui/screens/page_settings.dart'; import 'package:sortgame/ui/screens/page_settings.dart';
import 'package:unicons/unicons.dart';
class MenuItem { class MenuItem {
final String code;
final Icon icon; final Icon icon;
final Widget page; final Widget page;
const MenuItem({ const MenuItem({
required this.code,
required this.icon, required this.icon,
required this.page, required this.page,
}); });
...@@ -20,21 +18,18 @@ class MenuItem { ...@@ -20,21 +18,18 @@ class MenuItem {
class Menu { class Menu {
static const indexGame = 0; static const indexGame = 0;
static const menuItemGame = MenuItem( static const menuItemGame = MenuItem(
code: 'bottom_nav_game',
icon: Icon(UniconsLine.home), icon: Icon(UniconsLine.home),
page: PageGame(), page: PageGame(),
); );
static const indexSettings = 1; static const indexSettings = 1;
static const menuItemSettings = MenuItem( static const menuItemSettings = MenuItem(
code: 'bottom_nav_settings',
icon: Icon(UniconsLine.setting), icon: Icon(UniconsLine.setting),
page: PageSettings(), page: PageSettings(),
); );
static const indexAbout = 2; static const indexAbout = 2;
static const menuItemAbout = MenuItem( static const menuItemAbout = MenuItem(
code: 'bottom_nav_about',
icon: Icon(UniconsLine.info_circle), icon: Icon(UniconsLine.info_circle),
page: PageAbout(), page: PageAbout(),
); );
......
...@@ -39,11 +39,9 @@ final ColorScheme lightColorScheme = ColorScheme.light( ...@@ -39,11 +39,9 @@ final ColorScheme lightColorScheme = ColorScheme.light(
secondary: primarySwatch.shade500, secondary: primarySwatch.shade500,
onSecondary: Colors.white, onSecondary: Colors.white,
error: errorColor, error: errorColor,
background: textSwatch.shade200,
onBackground: textSwatch.shade500,
onSurface: textSwatch.shade500, onSurface: textSwatch.shade500,
surface: textSwatch.shade50, surface: textSwatch.shade50,
surfaceVariant: Colors.white, surfaceContainerHighest: Colors.white,
shadow: textSwatch.shade900.withOpacity(.1), shadow: textSwatch.shade900.withOpacity(.1),
); );
...@@ -52,11 +50,9 @@ final ColorScheme darkColorScheme = ColorScheme.dark( ...@@ -52,11 +50,9 @@ final ColorScheme darkColorScheme = ColorScheme.dark(
secondary: primarySwatch.shade500, secondary: primarySwatch.shade500,
onSecondary: Colors.white, onSecondary: Colors.white,
error: errorColor, error: errorColor,
background: const Color(0xFF171724),
onBackground: textSwatch.shade400,
onSurface: textSwatch.shade300, onSurface: textSwatch.shade300,
surface: const Color(0xFF262630), surface: const Color(0xFF262630),
surfaceVariant: const Color(0xFF282832), surfaceContainerHighest: const Color(0xFF282832),
shadow: textSwatch.shade900.withOpacity(.2), shadow: textSwatch.shade900.withOpacity(.2),
); );
...@@ -192,5 +188,3 @@ final ThemeData darkTheme = lightTheme.copyWith( ...@@ -192,5 +188,3 @@ final ThemeData darkTheme = lightTheme.copyWith(
), ),
), ),
); );
final ThemeData appTheme = darkTheme;
...@@ -2,16 +2,16 @@ import 'package:equatable/equatable.dart'; ...@@ -2,16 +2,16 @@ import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart'; import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:sortgame/models/game.dart'; import 'package:sortgame/models/game/game.dart';
import 'package:sortgame/models/settings_game.dart'; import 'package:sortgame/models/settings/settings_game.dart';
import 'package:sortgame/models/settings_global.dart'; import 'package:sortgame/models/settings/settings_global.dart';
part 'game_state.dart'; part 'game_state.dart';
class GameCubit extends HydratedCubit<GameState> { class GameCubit extends HydratedCubit<GameState> {
GameCubit() GameCubit()
: super(GameState( : super(GameState(
currentGame: Game.createNull(), currentGame: Game.createEmpty(),
)); ));
void updateState(Game game) { void updateState(Game game) {
...@@ -22,14 +22,21 @@ class GameCubit extends HydratedCubit<GameState> { ...@@ -22,14 +22,21 @@ class GameCubit extends HydratedCubit<GameState> {
void refresh() { void refresh() {
final Game game = Game( final Game game = Game(
items: state.currentGame.items, // Settings
gameSettings: state.currentGame.gameSettings, gameSettings: state.currentGame.gameSettings,
globalSettings: state.currentGame.globalSettings, globalSettings: state.currentGame.globalSettings,
// State
isRunning: state.currentGame.isRunning, isRunning: state.currentGame.isRunning,
isStarted: state.currentGame.isStarted,
isFinished: state.currentGame.isFinished, isFinished: state.currentGame.isFinished,
animationInProgress: state.currentGame.animationInProgress,
// Base data
items: state.currentGame.items,
// Game data
position: state.currentGame.position, position: state.currentGame.position,
score: state.currentGame.score, score: state.currentGame.score,
); );
// game.dump();
updateState(game); updateState(game);
} }
...@@ -38,7 +45,8 @@ class GameCubit extends HydratedCubit<GameState> { ...@@ -38,7 +45,8 @@ class GameCubit extends HydratedCubit<GameState> {
required GameSettings gameSettings, required GameSettings gameSettings,
required GlobalSettings globalSettings, required GlobalSettings globalSettings,
}) { }) {
Game newGame = Game.createNew( final Game newGame = Game.createNew(
// Settings
gameSettings: gameSettings, gameSettings: gameSettings,
globalSettings: globalSettings, globalSettings: globalSettings,
); );
...@@ -50,11 +58,23 @@ class GameCubit extends HydratedCubit<GameState> { ...@@ -50,11 +58,23 @@ class GameCubit extends HydratedCubit<GameState> {
} }
void quitGame() { void quitGame() {
state.currentGame.updateGameIsRunning(false); state.currentGame.isRunning = false;
refresh();
}
void resumeSavedGame() {
state.currentGame.isRunning = true;
refresh();
}
void deleteSavedGame() {
state.currentGame.isRunning = false;
state.currentGame.isFinished = true;
refresh(); refresh();
} }
void increasePosition() { void increasePosition() {
state.currentGame.isStarted = true;
if (state.currentGame.position < state.currentGame.items.length) { if (state.currentGame.position < state.currentGame.items.length) {
state.currentGame.increasePosition(); state.currentGame.increasePosition();
} else { } else {
...@@ -70,7 +90,7 @@ class GameCubit extends HydratedCubit<GameState> { ...@@ -70,7 +90,7 @@ class GameCubit extends HydratedCubit<GameState> {
@override @override
GameState? fromJson(Map<String, dynamic> json) { GameState? fromJson(Map<String, dynamic> json) {
Game currentGame = json['currentGame'] as Game; final Game currentGame = json['currentGame'] as Game;
return GameState( return GameState(
currentGame: currentGame, currentGame: currentGame,
......
...@@ -12,8 +12,4 @@ class GameState extends Equatable { ...@@ -12,8 +12,4 @@ class GameState extends Equatable {
List<dynamic> get props => <dynamic>[ List<dynamic> get props => <dynamic>[
currentGame, currentGame,
]; ];
Map<String, dynamic> get values => <String, dynamic>{
'currentGame': currentGame,
};
} }
...@@ -2,8 +2,8 @@ import 'package:equatable/equatable.dart'; ...@@ -2,8 +2,8 @@ import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart'; import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:sortgame/models/settings_game.dart'; import 'package:sortgame/config/default_game_settings.dart';
import 'package:sortgame/utils/tools.dart'; import 'package:sortgame/models/settings/settings_game.dart';
part 'settings_game_state.dart'; part 'settings_game_state.dart';
...@@ -11,51 +11,53 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> { ...@@ -11,51 +11,53 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
GameSettingsCubit() : super(GameSettingsState(settings: GameSettings.createDefault())); GameSettingsCubit() : super(GameSettingsState(settings: GameSettings.createDefault()));
void setValues({ void setValues({
int? itemsCount, String? itemsCount,
int? theme, String? themeCode,
}) { }) {
emit( emit(
GameSettingsState( GameSettingsState(
settings: GameSettings( settings: GameSettings(
itemsCount: itemsCount ?? state.settings.itemsCount, itemsCount: itemsCount ?? state.settings.itemsCount,
theme: theme ?? state.settings.theme, themeCode: themeCode ?? state.settings.themeCode,
), ),
), ),
); );
} }
int getParameterValue(String code) { String getParameterValue(String code) {
switch (code) { switch (code) {
case 'itemsCount': case DefaultGameSettings.parameterCodeItemsCount:
return GameSettings.getItemsCountValueFromUnsafe(state.settings.itemsCount); return GameSettings.getItemsCountValueFromUnsafe(state.settings.itemsCount);
case 'theme': case DefaultGameSettings.parameterCodeThemeCode:
return GameSettings.getThemeValueFromUnsafe(state.settings.theme); return GameSettings.getThemeValueFromUnsafe(state.settings.themeCode);
}
return 0;
} }
void setParameterValue(String code, int value) { return '';
printlog('GameSettingsCubit.setParameterValue'); }
printlog('code: $code / value: $value');
int itemsCount = code == 'itemsCount' ? value : getParameterValue('itemsCount'); void setParameterValue(String code, String value) {
int theme = code == 'theme' ? value : getParameterValue('theme'); final String itemsCount = code == DefaultGameSettings.parameterCodeItemsCount
? value
: getParameterValue(DefaultGameSettings.parameterCodeItemsCount);
final String themeCode = code == DefaultGameSettings.parameterCodeThemeCode
? value
: getParameterValue(DefaultGameSettings.parameterCodeThemeCode);
setValues( setValues(
itemsCount: itemsCount, itemsCount: itemsCount,
theme: theme, themeCode: themeCode,
); );
} }
@override @override
GameSettingsState? fromJson(Map<String, dynamic> json) { GameSettingsState? fromJson(Map<String, dynamic> json) {
int itemsCount = json['itemsCount'] as int; final String itemsCount = json[DefaultGameSettings.parameterCodeItemsCount] as String;
int theme = json['theme'] as int; final String themeCode = json[DefaultGameSettings.parameterCodeThemeCode] as String;
return GameSettingsState( return GameSettingsState(
settings: GameSettings( settings: GameSettings(
itemsCount: itemsCount, itemsCount: itemsCount,
theme: theme, themeCode: themeCode,
), ),
); );
} }
...@@ -63,8 +65,8 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> { ...@@ -63,8 +65,8 @@ class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
@override @override
Map<String, dynamic>? toJson(GameSettingsState state) { Map<String, dynamic>? toJson(GameSettingsState state) {
return <String, dynamic>{ return <String, dynamic>{
'itemsCount': state.settings.itemsCount, DefaultGameSettings.parameterCodeItemsCount: state.settings.itemsCount,
'theme': state.settings.theme, DefaultGameSettings.parameterCodeThemeCode: state.settings.themeCode,
}; };
} }
} }
...@@ -12,8 +12,4 @@ class GameSettingsState extends Equatable { ...@@ -12,8 +12,4 @@ class GameSettingsState extends Equatable {
List<dynamic> get props => <dynamic>[ List<dynamic> get props => <dynamic>[
settings, settings,
]; ];
Map<String, dynamic> get values => <String, dynamic>{
'settings': settings,
};
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment