Skip to content

Commit

Permalink
[WIP] Added a numberpicker (UI only) to the calculator
Browse files Browse the repository at this point in the history
  • Loading branch information
Wolfteam committed Mar 1, 2021
1 parent 4db6bd7 commit c7ae7ee
Show file tree
Hide file tree
Showing 23 changed files with 650 additions and 212 deletions.
Expand Up @@ -2,6 +2,7 @@ import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:genshindb/domain/app_constants.dart';
import 'package:genshindb/domain/assets.dart';
import 'package:genshindb/domain/enums/enums.dart';
import 'package:genshindb/domain/models/models.dart';
Expand Down Expand Up @@ -41,10 +42,12 @@ class CalculatorAscMaterialsBloc extends Bloc<CalculatorAscMaterialsEvent, Calcu
image: Assets.getCharacterPath(char.image),
name: translation.name,
rarity: char.rarity,
materials: _getCharacterMaterialsToUse(char, e.currentLevel, e.desiredLevel, e.skills),
materials: _getCharacterMaterialsToUse(char, e.currentAscensionLevel, e.desiredAscensionLevel, e.skills),
currentLevel: e.currentLevel,
desiredLevel: e.desiredLevel,
skills: e.skills,
desiredAscensionLevel: e.desiredAscensionLevel,
currentAscensionLevel: e.currentAscensionLevel,
)
];

Expand All @@ -61,9 +64,11 @@ class CalculatorAscMaterialsBloc extends Bloc<CalculatorAscMaterialsEvent, Calcu
image: weapon.fullImagePath,
name: translation.name,
rarity: weapon.rarity,
materials: _getWeaponMaterialsToUse(weapon, e.currentLevel, e.desiredLevel),
materials: _getWeaponMaterialsToUse(weapon, e.currentAscensionLevel, e.desiredAscensionLevel),
currentLevel: e.currentLevel,
desiredLevel: e.desiredLevel,
desiredAscensionLevel: e.desiredAscensionLevel,
currentAscensionLevel: e.currentAscensionLevel,
)
];
return currentState.copyWith.call(items: items, summary: _generateSummary(items.expand((i) => i.materials).toList()));
Expand All @@ -77,10 +82,12 @@ class CalculatorAscMaterialsBloc extends Bloc<CalculatorAscMaterialsEvent, Calcu
final currentChar = currentState.items.elementAt(e.index);
final char = _genshinService.getCharacter(currentChar.key);
final updatedChar = currentChar.copyWith.call(
materials: _getCharacterMaterialsToUse(char, e.currentLevel, e.desiredLevel, e.skills),
materials: _getCharacterMaterialsToUse(char, e.currentAscensionLevel, e.desiredAscensionLevel, e.skills),
currentLevel: e.currentLevel,
desiredLevel: e.desiredLevel,
skills: e.skills,
desiredAscensionLevel: e.desiredAscensionLevel,
currentAscensionLevel: e.currentAscensionLevel,
);

return _updateItem(e.index, updatedChar);
Expand All @@ -89,9 +96,11 @@ class CalculatorAscMaterialsBloc extends Bloc<CalculatorAscMaterialsEvent, Calcu
final currentWeapon = currentState.items.elementAt(e.index);
final weapon = _genshinService.getWeapon(currentWeapon.key);
final updatedWeapon = currentWeapon.copyWith.call(
materials: _getWeaponMaterialsToUse(weapon, e.currentLevel, e.desiredLevel),
materials: _getWeaponMaterialsToUse(weapon, e.currentAscensionLevel, e.desiredAscensionLevel),
currentLevel: e.currentLevel,
desiredLevel: e.desiredLevel,
desiredAscensionLevel: e.desiredAscensionLevel,
currentAscensionLevel: e.currentAscensionLevel,
);

return _updateItem(e.index, updatedWeapon);
Expand Down Expand Up @@ -152,6 +161,7 @@ class CalculatorAscMaterialsBloc extends Bloc<CalculatorAscMaterialsEvent, Calcu
case MaterialType.jewels:
case MaterialType.talents:
case MaterialType.others:
case MaterialType.ingredient:
key = AscensionMaterialSummaryType.others;
break;
}
Expand All @@ -177,12 +187,12 @@ class CalculatorAscMaterialsBloc extends Bloc<CalculatorAscMaterialsEvent, Calcu

List<ItemAscensionMaterialModel> _getCharacterMaterialsToUse(
CharacterFileModel char,
int currentLevel,
int desiredLevel,
int currentAscensionLevel,
int desiredAscensionLevel,
List<CharacterSkill> skills,
) {
final ascensionMaterials =
char.ascensionMaterials.where((m) => m.rank > currentLevel && m.rank <= desiredLevel).expand((e) => e.materials).toList();
char.ascensionMaterials.where((m) => m.rank > currentAscensionLevel && m.rank <= desiredAscensionLevel).expand((e) => e.materials).toList();

final skillMaterials = <ItemAscensionMaterialModel>[];

Expand Down Expand Up @@ -218,11 +228,11 @@ class CalculatorAscMaterialsBloc extends Bloc<CalculatorAscMaterialsEvent, Calcu

List<ItemAscensionMaterialModel> _getWeaponMaterialsToUse(
WeaponFileModel weapon,
int currentLevel,
int desiredLevel,
int currentAscensionLevel,
int desiredAscensionLevel,
) {
final materials = weapon.ascensionMaterials
.where((m) => m.level > _mapToWeaponLevel(currentLevel) && m.level <= _mapToWeaponLevel(desiredLevel))
.where((m) => m.level > _mapToWeaponLevel(currentAscensionLevel) && m.level <= _mapToWeaponLevel(desiredAscensionLevel))
.expand((m) => m.materials)
.toList();

Expand Down Expand Up @@ -254,20 +264,9 @@ class CalculatorAscMaterialsBloc extends Bloc<CalculatorAscMaterialsEvent, Calcu
//(from 1 to 10 with 1 inclusive)
case 0:
return 0;
case 1:
return 20;
case 2:
return 40;
case 3:
return 50;
case 4:
return 60;
case 5:
return 70;
case 6:
return 80;
default:
throw Exception('The provided value = $val is not mapped');
final entry = itemAscensionLevelMap.entries.firstWhere((kvp) => kvp.key == val);
return entry.value;
}
}
}
Expand Up @@ -8,26 +8,34 @@ abstract class CalculatorAscMaterialsEvent with _$CalculatorAscMaterialsEvent {
@required String key,
@required int currentLevel,
@required int desiredLevel,
@required int currentAscensionLevel,
@required int desiredAscensionLevel,
@required List<CharacterSkill> skills,
}) = _AddCharacter;

const factory CalculatorAscMaterialsEvent.updateCharacter({
@required int index,
@required int currentLevel,
@required int desiredLevel,
@required int currentAscensionLevel,
@required int desiredAscensionLevel,
@required List<CharacterSkill> skills,
}) = _UpdateCharacter;

const factory CalculatorAscMaterialsEvent.addWeapon({
@required String key,
@required int currentLevel,
@required int desiredLevel,
@required int currentAscensionLevel,
@required int desiredAscensionLevel,
}) = _AddWeapon;

const factory CalculatorAscMaterialsEvent.updateWeapon({
@required int index,
@required int currentLevel,
@required int desiredLevel,
@required int currentAscensionLevel,
@required int desiredAscensionLevel,
}) = _UpdateWeapon;

const factory CalculatorAscMaterialsEvent.removeItem({
Expand Down
Expand Up @@ -2,9 +2,11 @@ import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:genshindb/domain/app_constants.dart';
import 'package:genshindb/domain/assets.dart';
import 'package:genshindb/domain/models/models.dart';
import 'package:genshindb/domain/services/genshin_service.dart';
import 'package:tuple/tuple.dart';

part 'calculator_asc_materials_item_bloc.freezed.dart';
part 'calculator_asc_materials_item_event.dart';
Expand All @@ -17,6 +19,8 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven
static int maxSkillLevel = 10;
static int minAscensionLevel = 1;
static int maxAscensionLevel = 6;
static int minItemLevel = 1;
static int maxItemLevel = 90;

_LoadedState get currentState => state as _LoadedState;

Expand All @@ -38,19 +42,26 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven
return CalculatorAscMaterialsItemState.loaded(
name: translation.name,
imageFullPath: Assets.getCharacterPath(char.image),
currentLevel: minAscensionLevel,
desiredLevel: maxAscensionLevel,
skills:
translation.skills.map((e) => CharacterSkill.skill(name: e.title, currentLevel: minSkillLevel, desiredLevel: maxSkillLevel)).toList(),
currentLevel: itemAscensionLevelMap.entries.first.value,
desiredLevel: maxItemLevel,
currentAscensionLevel: minAscensionLevel,
desiredAscensionLevel: maxAscensionLevel,
skills: translation.skills
.map(
(e) => CharacterSkill.skill(name: e.title, currentLevel: minSkillLevel, desiredLevel: maxSkillLevel),
)
.toList(),
);
}
final weapon = _genshinService.getWeapon(e.key);
final translation = _genshinService.getWeaponTranslation(e.key);
return CalculatorAscMaterialsItemState.loaded(
name: translation.name,
imageFullPath: weapon.fullImagePath,
currentLevel: minAscensionLevel,
desiredLevel: maxAscensionLevel,
currentLevel: itemAscensionLevelMap.entries.first.value,
desiredLevel: maxItemLevel,
currentAscensionLevel: minAscensionLevel,
desiredAscensionLevel: maxAscensionLevel,
);
},
loadWith: (e) {
Expand All @@ -63,6 +74,8 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven
currentLevel: e.currentLevel,
desiredLevel: e.desiredLevel,
skills: e.skills,
currentAscensionLevel: e.currentAscensionLevel,
desiredAscensionLevel: e.desiredAscensionLevel,
);
}

Expand All @@ -73,34 +86,35 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven
imageFullPath: weapon.fullImagePath,
currentLevel: e.currentLevel,
desiredLevel: e.desiredLevel,
currentAscensionLevel: e.currentAscensionLevel,
desiredAscensionLevel: e.desiredAscensionLevel,
);
},
currentLevelChanged: (e) {
return _ascensionChanged(e.newValue, currentState.desiredLevel);
},
desiredLevelChanged: (e) {
return _ascensionChanged(currentState.currentLevel, e.newValue);
},
skillCurrentLevelChanged: (e) {
return _skillChanged(e.index, e.newValue, true);
},
skillDesiredLevelChanged: (e) {
return _skillChanged(e.index, e.newValue, false);
},
currentLevelChanged: (e) => _levelChanged(e.newValue, currentState.desiredLevel),
desiredLevelChanged: (e) => _levelChanged(currentState.currentLevel, e.newValue),
currentAscensionLevelChanged: (e) => _ascensionChanged(e.newValue, currentState.desiredAscensionLevel),
desiredAscensionLevelChanged: (e) => _ascensionChanged(currentState.currentAscensionLevel, e.newValue),
skillCurrentLevelChanged: (e) => _skillChanged(e.index, e.newValue, true),
skillDesiredLevelChanged: (e) => _skillChanged(e.index, e.newValue, false),
);

yield s;
}

CalculatorAscMaterialsItemState _ascensionChanged(int currentLevel, int desiredLevel) {
var cl = currentLevel;
var dl = desiredLevel;
//TODO: COMPLETE THIS

if (cl > dl) {
dl = cl;
} else if (dl < cl) {
cl = dl;
}
CalculatorAscMaterialsItemState _levelChanged(int currentLevel, int desiredLevel) {
final tuple = _checkProvidedLevels(currentLevel, desiredLevel);
final cl = tuple.item1;
final dl = tuple.item2;

return currentState.copyWith.call(currentLevel: currentLevel, desiredLevel: desiredLevel);
}

CalculatorAscMaterialsItemState _ascensionChanged(int currentLevel, int desiredLevel) {
final tuple = _checkProvidedLevels(currentLevel, desiredLevel);
final cl = tuple.item1;
final dl = tuple.item2;

//Here we consider the 0, because otherwise we will always start from a current level of 1, and sometimes, we want to know the whole thing
//(from 1 to 10 with 1 inclusive)
Expand All @@ -112,7 +126,7 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven
return currentState;
}

return currentState.copyWith.call(currentLevel: cl, desiredLevel: dl);
return currentState.copyWith.call(currentAscensionLevel: cl, desiredAscensionLevel: dl);
}

CalculatorAscMaterialsItemState _skillChanged(int skillIndex, int newValue, bool currentChanged) {
Expand All @@ -125,14 +139,9 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven
continue;
}

var cl = currentChanged ? newValue : item.currentLevel;
var dl = currentChanged ? item.desiredLevel : newValue;

if (cl > dl) {
dl = cl;
} else if (dl < cl) {
cl = dl;
}
final tuple = _checkProvidedLevels(currentChanged ? newValue : item.currentLevel, currentChanged ? item.desiredLevel : newValue);
final cl = tuple.item1;
final dl = tuple.item2;

if (cl > maxSkillLevel || cl < minSkillLevel) {
return currentState;
Expand All @@ -147,4 +156,17 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven

return currentState.copyWith.call(skills: skills);
}

Tuple2<int, int> _checkProvidedLevels(int currentLevel, int desiredLevel) {
var cl = currentLevel;
var dl = desiredLevel;

if (cl > dl) {
dl = cl;
} else if (dl < cl) {
cl = dl;
}

return Tuple2<int, int>(cl, dl);
}
}
Expand Up @@ -12,6 +12,8 @@ abstract class CalculatorAscMaterialsItemEvent with _$CalculatorAscMaterialsItem
@required bool isCharacter,
@required int currentLevel,
@required int desiredLevel,
@required int currentAscensionLevel,
@required int desiredAscensionLevel,
@required List<CharacterSkill> skills,
}) = _LoadWith;

Expand All @@ -23,6 +25,14 @@ abstract class CalculatorAscMaterialsItemEvent with _$CalculatorAscMaterialsItem
@required int newValue,
}) = _DesiredLevelChanged;

const factory CalculatorAscMaterialsItemEvent.currentAscensionLevelChanged({
@required int newValue,
}) = _CurrentAscensionLevelChanged;

const factory CalculatorAscMaterialsItemEvent.desiredAscensionLevelChanged({
@required int newValue,
}) = _DesiredAscensionLevelChanged;

const factory CalculatorAscMaterialsItemEvent.skillCurrentLevelChanged({
@required int index,
@required int newValue,
Expand Down
Expand Up @@ -9,6 +9,8 @@ abstract class CalculatorAscMaterialsItemState with _$CalculatorAscMaterialsItem
@required String imageFullPath,
@required int currentLevel,
@required int desiredLevel,
@required int currentAscensionLevel,
@required int desiredAscensionLevel,
@Default([]) List<CharacterSkill> skills,
}) = _LoadedState;
}

0 comments on commit c7ae7ee

Please sign in to comment.