Skip to content

Commit

Permalink
Merge branch '3.2' into release/web
Browse files Browse the repository at this point in the history
  • Loading branch information
Arenukvern committed May 15, 2024
2 parents 019cc9e + 196b595 commit e6d20cf
Show file tree
Hide file tree
Showing 48 changed files with 999 additions and 222 deletions.
2 changes: 1 addition & 1 deletion .fvm/fvm_config.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"flutterSdkVersion": "master"
"flutterSdkVersion": "3.22.0"
}
2 changes: 1 addition & 1 deletion .fvmrc
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"flutter": "master"
"flutter": "3.22.0"
}
12 changes: 6 additions & 6 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@
"[dart]": {
"editor.formatOnSave": true,
"editor.formatOnType": true,
"editor.rulers": [
80
]
"editor.rulers": [80]
},
"dart.flutterSdkPath": ".fvm/versions/master",
"dart.flutterSdkPath": ".fvm/versions/3.22.0",
"search.exclude": {
"**/.fvm": true
},
"files.watcherExclude": {
"**/.fvm": true
},
"dart.runPubGetOnPubspecChanges": "never"
}
"dart.runPubGetOnPubspecChanges": "never",
"IDX.aI.enableInlineCompletion": true,
"IDX.aI.enableCodebaseIndexing": true
}
11 changes: 11 additions & 0 deletions lib/pack_core/global_states/global_game/global_game_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,17 @@ class GlobalGameBloc extends Cubit<GlobalGameBlocState> {
level = level.copyWith(canvasDataId: newCanvasData.id);
}
if (event.isNewStart) {
if (level.featuresSettings.isTechnologiesEnabled) {
level = level.copyWith.characters.playerCharacter(
balloonParams: BalloonLiftParamsModel.initial,
);
} else {
level = level.copyWith.characters.playerCharacter(
balloonParams: BalloonLiftParamsModel.initial.copyWith(
powerUsage: dto.mechanics.engine.maxPowerUsage,
),
);
}
level = level.copyWith.characters.playerCharacter(
balloonPowers: BalloonLiftPowersModel.initial,
);
Expand Down
7 changes: 6 additions & 1 deletion lib/pack_core/global_states/global_states_initializer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,12 @@ class GlobalStatesInitializer implements StateInitializer {
final analyticsService = read<AnalyticsService>();
final canvasCubit = read<CanvasCubit>();
final appSettingsNotifier = read<AppSettingsNotifier>();
await appSettingsNotifier.onLoad();
final onlineStatusService = read<OnlineStatusService>();
await Future.wait([
onlineStatusService.onLoad(),
appSettingsNotifier.onLoad(),
]);

final wordsType = await services.userWordsRepository.loadUserWords();
await dictionariesBloc.onLoad(wordsType: wordsType);
await canvasCubit.loadInitialData();
Expand Down
25 changes: 16 additions & 9 deletions lib/pack_core/global_states/level/level_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class LevelBloc extends Cubit<LevelBlocState> {
);
}

Languages get wordsLanguage => state.wordsLanguage;
void onChangeWordsLanguage(final Languages language) {
final updatedState = state.copyWith(
wordsLanguage: language,
Expand Down Expand Up @@ -193,6 +194,14 @@ class LevelBloc extends Cubit<LevelBlocState> {
phaseType: GamePhaseType.entryWord,
);
emit(updatedState);
_onApplyMultiplier(energyApplicationType);
dto.levelPlayersCubit.onSwitchToNextPlayer(const SwitchToNextPlayerEvent());
}

void _onApplyMultiplier(
final EnergyApplicationType energyApplicationType,
) {
final liveState = state;

final levelPlayersCubit = dto.levelPlayersCubit;
final technologiesCubit = dto.technologiesCubit;
Expand All @@ -211,18 +220,16 @@ class LevelBloc extends Cubit<LevelBlocState> {
technologiesCubit.onResearchTechnology(
ResearchTechnologyEvent(score: appliedScore),
);
case EnergyApplicationType.noop:
case EnergyApplicationType.crystalMove || EnergyApplicationType.noop:
}

final playerId = levelPlayersCubit.state.currentPlayerId;
levelPlayersCubit
..onUpdatePlayerHighscore(
UpdatePlayerHighscoreEvent(
score: appliedScore * -1,
playerId: playerId,
),
)
..onSwitchToNextPlayer(const SwitchToNextPlayerEvent());
levelPlayersCubit.onUpdatePlayerHighscore(
UpdatePlayerHighscoreEvent(
score: appliedScore * -1,
playerId: playerId,
),
);
}

String getWordSuggestion() {
Expand Down
1 change: 1 addition & 0 deletions lib/pack_core/global_states/level/level_bloc_events.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ part of 'level_bloc.dart';
enum EnergyApplicationType {
refueling,
researchingTechnology,
crystalMove,
noop,
}

Expand Down
24 changes: 14 additions & 10 deletions lib/pack_core/global_states/level_players/level_players_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class LevelPlayersBloc extends Cubit<LevelPlayersBlocState> {
super(LevelPlayersBlocState.empty);
final LevelPlayersBlocDiDto diDto;
final _log = Logger();
PlayerCharacterModel get playerCharacter => state.playerCharacter;

@override
Future<void> close() {
Expand Down Expand Up @@ -83,15 +84,20 @@ class LevelPlayersBloc extends Cubit<LevelPlayersBlocState> {
) =>
emit(state.copyWith(playerCharacter: value));

double get powerUsage => playerCharacter.balloonParams.powerUsage;
void onPowerUsageChange(final String? value) => onChangeCharacter(
playerCharacter.copyWith.balloonParams(
powerUsage: double.tryParse(value ?? '') ?? 0,
),
);

void onChangeCharacterPosition({
required final Vector2 distanceToOrigin,
required final LiftForceModel liftForce,
}) {
final updatedState = state.copyWith(
playerCharacter: state.playerCharacter.copyWith(
distanceToOrigin: distanceToOrigin.toSerializedVector2(),
balloonPowers: liftForce.updatedPowers,
),
final updatedState = state.copyWith.playerCharacter(
distanceToOrigin: distanceToOrigin.toSerializedVector2(),
balloonPowers: liftForce.updatedPowers,
);

emit(updatedState);
Expand All @@ -104,11 +110,9 @@ class LevelPlayersBloc extends Cubit<LevelPlayersBlocState> {
final power = scoreMechanics.convertScoreToPower(
score: event.score,
);
final updatedState = state.copyWith(
playerCharacter: state.playerCharacter.copyWith(
balloonPowers: state.playerCharacter.balloonPowers.copyWith(
power: state.playerCharacter.balloonPowers.power + power,
),
final updatedState = state.copyWith.playerCharacter(
balloonPowers: playerCharacter.balloonPowers.copyWith(
power: playerCharacter.balloonPowers.power + power,
),
);
emit(updatedState);
Expand Down
38 changes: 38 additions & 0 deletions lib/pack_core/global_states/technologies/technologies_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,44 @@ class TechnologiesCubit extends Cubit<TechnologiesCubitState>
final TechnologiesCubitDto dto;
@override
void onConsumeTickEvent() {}

/// since ascending and descending are most primitive technologies
/// if they are unlocked, we can make visible actions tab
bool checkIsActionsViewUnblocked({final Languages? language}) => [
TechnologyType.ascending,
TechnologyType.descending,
].every(
(final type) => checkIsTechnologyResearchedByType(
type: type,
language: language,
),
);

bool checkIsTechnologyResearchedByType({
required final TechnologyType type,
final Languages? language,
}) =>
checkIsTechnologyResearched(
id: TechnologyModelId(type),
language: language,
);
bool checkIsTechnologyResearched({
required final TechnologyModelId id,
final Languages? language,
}) {
final techProgress = _getTechnologyProgress(
technologyId: id,
progressTree: state.progress,
);
if (techProgress == null) return false;
return dto.mechanics.technology
.checkIsUnlockedForLanguage(
unlockCondition: techProgress.unlockCondition,
language: language,
)
.isUnlocked;
}

void onResearchingTechnologyChanged(
final TechnologyModelId id,
// ignore: avoid_positional_boolean_parameters
Expand Down
Empty file.
6 changes: 3 additions & 3 deletions lib/subgames/quick_game/debug_side_bar/debug_side_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class UiDebugSideBarBody extends StatelessWidget {
@override
Widget build(final BuildContext context) {
final screenCubit = context.watch<UiDebugSideBarCubit>();
context.watch<LevelPlayersBloc>();
final levelPlayerBloc = context.watch<LevelPlayersBloc>();
final debugCubit = context.watch<DebugCubit>();
final screenSize = MediaQuery.sizeOf(context);
final theme = Theme.of(context);
Expand Down Expand Up @@ -144,8 +144,8 @@ class UiDebugSideBarBody extends StatelessWidget {
labelText: 'maxPower',
),
UiTextField.underlined(
value: screenCubit.powerUsage.toString(),
onChanged: screenCubit.onPowerUsageChange,
value: levelPlayerBloc.powerUsage.toString(),
onChanged: levelPlayerBloc.onPowerUsageChange,
keyboardType: TextInputType.number,
labelText: 'powerUsage',
),
Expand Down
9 changes: 0 additions & 9 deletions lib/subgames/quick_game/debug_side_bar/debug_side_bar_vm.dart
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,6 @@ class UiDebugSideBarCubit extends Cubit<UiDebugSideBarCubitState> {
);
}

double get powerUsage => _character.balloonParams.powerUsage;
void onPowerUsageChange(final String? value) {
changeParams(
_character.balloonParams.copyWith(
powerUsage: double.tryParse(value ?? '') ?? 0,
),
);
}

double get gravityForce => _gameConstants.forces.gravityForce;
void onGravityForceChange(final String? value) {
changeForces(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,60 +29,63 @@ class LevelOptionsScreen extends HookWidget {
useListenable(uxState.isDictionariesLoading);
final statusCubit = context.watch<StatesStatusesCubit>();

return SingleChildScrollView(
child: Column(
children: [
uiTheme.verticalBoxes.medium,
GestureDetector(
onTap: () => unblockerNotifier.value++,
child: Text(
S.of(context).selectPlayers.toUpperCase(),
style: context.textThemeBold.bodyLarge,
textAlign: TextAlign.center,
return Scrollbar(
thumbVisibility: true,
child: SingleChildScrollView(
child: Column(
children: [
uiTheme.verticalBoxes.medium,
GestureDetector(
onTap: () => unblockerNotifier.value++,
child: Text(
S.of(context).selectPlayers.toUpperCase(),
style: context.textThemeBold.bodyLarge,
textAlign: TextAlign.center,
),
),
),
uiTheme.verticalBoxes.medium,
ConstrainedBox(
constraints: const BoxConstraints(maxHeight: 140),
child: PlayerProfileRow(
checkIsPlayerSelected: uxState.checkIsPlayerSelected,
onSelected: uxState.onPlayerSelected,
uiTheme.verticalBoxes.medium,
ConstrainedBox(
constraints: const BoxConstraints(maxHeight: 140),
child: PlayerProfileRow(
checkIsPlayerSelected: uxState.checkIsPlayerSelected,
onSelected: uxState.onPlayerSelected,
),
),
),
uiTheme.verticalBoxes.medium,
CheckboxListTile(
value: uxState.shouldStartTutorial,
onChanged: uxState.changeShouldStartTutorial,
title: Text(S.of(context).enableTutorial),
),
uiTheme.verticalBoxes.medium,
_ExperimentsListView(unblockerNotifier: unblockerNotifier),
uiTheme.verticalBoxes.medium,
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Tooltip(
message: S.of(context).createNewPlayerTooltip,
child: TextButton.icon(
onPressed: onCreatePlayer,
icon: const Icon(Icons.add),
label: Text(S.of(context).createPlayer),
uiTheme.verticalBoxes.medium,
CheckboxListTile(
value: uxState.shouldStartTutorial,
onChanged: uxState.changeShouldStartTutorial,
title: Text(S.of(context).enableTutorial),
),
uiTheme.verticalBoxes.medium,
_ExperimentsListView(unblockerNotifier: unblockerNotifier),
uiTheme.verticalBoxes.medium,
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Tooltip(
message: S.of(context).createNewPlayerTooltip,
child: TextButton.icon(
onPressed: onCreatePlayer,
icon: const Icon(Icons.add),
label: Text(S.of(context).createPlayer),
),
),
),
UiTextButton.text(
text: S.of(context).play,
isLoading: uxState.isDictionariesLoading.value ||
statusCubit.isLoading,
isLongButton: true,
mainAlignment: MainAxisAlignment.center,
onPressed: uxState.playersIds.isEmpty
? null
: () async => uxState.onPlay(context),
),
],
),
uiTheme.verticalBoxes.medium,
],
UiTextButton.text(
text: S.of(context).play,
isLoading: uxState.isDictionariesLoading.value ||
statusCubit.isLoading,
isLongButton: true,
mainAlignment: MainAxisAlignment.center,
onPressed: uxState.playersIds.isEmpty
? null
: () async => uxState.onPlay(context),
),
],
),
uiTheme.verticalBoxes.medium,
],
),
),
);
}
Expand Down Expand Up @@ -147,7 +150,7 @@ class _ExperimentsListView extends HookWidget {
value: {
Languages.en:
// ignore: lines_longer_than_80_chars
'Notice: this feature requires to preload a massive amount of dictionaries (about 30 mb), so first level loading will take several minutes.',
'Notice: this feature requires to preload a massive amount of dictionaries (about 30 mb), so first level loading may take a few minutes.',
Languages.ru:
// ignore: lines_longer_than_80_chars
'Примечание: данная функция требует предварительного большой загрузки дополнительных словарей (около 30 мб), поэтому первая загрузка уровня займет несколько минут.',
Expand Down
Loading

0 comments on commit e6d20cf

Please sign in to comment.