Skip to content

Commit

Permalink
[WIP] More work to make the calculator work properly
Browse files Browse the repository at this point in the history
  • Loading branch information
Wolfteam committed Mar 3, 2021
1 parent c7ae7ee commit 36b4cc7
Show file tree
Hide file tree
Showing 6 changed files with 240 additions and 40 deletions.
Expand Up @@ -46,11 +46,20 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven
desiredLevel: maxItemLevel,
currentAscensionLevel: minAscensionLevel,
desiredAscensionLevel: maxAscensionLevel,
skills: translation.skills
.map(
(e) => CharacterSkill.skill(name: e.title, currentLevel: minSkillLevel, desiredLevel: maxSkillLevel),
)
.toList(),
skills: translation.skills.map(
(e) {
final enableTuple = _isSkillEnabled(minSkillLevel, maxSkillLevel, minAscensionLevel, maxAscensionLevel);
return CharacterSkill.skill(
name: e.title,
currentLevel: minSkillLevel,
desiredLevel: maxSkillLevel,
isCurrentDecEnabled: enableTuple.item1,
isCurrentIncEnabled: enableTuple.item2,
isDesiredDecEnabled: enableTuple.item3,
isDesiredIncEnabled: enableTuple.item4,
);
},
).toList(),
);
}
final weapon = _genshinService.getWeapon(e.key);
Expand Down Expand Up @@ -90,45 +99,63 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven
desiredAscensionLevel: e.desiredAscensionLevel,
);
},
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),
currentLevelChanged: (e) => _levelChanged(e.newValue, currentState.desiredLevel, true),
desiredLevelChanged: (e) => _levelChanged(currentState.currentLevel, e.newValue, false),
currentAscensionLevelChanged: (e) => _ascensionChanged(e.newValue, currentState.desiredAscensionLevel, true),
desiredAscensionLevelChanged: (e) => _ascensionChanged(currentState.currentAscensionLevel, e.newValue, false),
skillCurrentLevelChanged: (e) => _skillChanged(e.index, e.newValue, true),
skillDesiredLevelChanged: (e) => _skillChanged(e.index, e.newValue, false),
);

yield s;
}

//TODO: COMPLETE THIS

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

return currentState.copyWith.call(currentLevel: currentLevel, desiredLevel: desiredLevel);
final cAsc = _getClosestAscensionLevel(cl);
final dAsc = _getClosestAscensionLevel(dl);
final skills = _updateSkills(cAsc, dAsc);

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

CalculatorAscMaterialsItemState _ascensionChanged(int currentLevel, int desiredLevel) {
final tuple = _checkProvidedLevels(currentLevel, desiredLevel);
final cl = tuple.item1;
final dl = tuple.item2;
CalculatorAscMaterialsItemState _ascensionChanged(int currentLevel, int desiredLevel, bool currentChanged) {
final tuple = _checkProvidedLevels(currentLevel, desiredLevel, currentChanged);
final cAsc = tuple.item1;
final dAsc = 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)
if (cl > maxAscensionLevel || (cl < minAscensionLevel && cl != 0)) {
if (cAsc > maxAscensionLevel || (cAsc < minAscensionLevel && cAsc != 0)) {
return currentState;
}

if (dl > maxAscensionLevel || dl < minAscensionLevel) {
if (dAsc > maxAscensionLevel || dAsc < minAscensionLevel) {
return currentState;
}

return currentState.copyWith.call(currentAscensionLevel: cl, desiredAscensionLevel: dl);
final cl = _getItemLevelToUse(cAsc, currentState.currentLevel);
final dl = _getItemLevelToUse(dAsc, currentState.desiredLevel);
final skills = _updateSkills(cAsc, dAsc);
return currentState.copyWith.call(
currentLevel: cl,
desiredLevel: dl,
currentAscensionLevel: cAsc,
desiredAscensionLevel: dAsc,
skills: skills,
);
}

//TODO: THIS ?
CalculatorAscMaterialsItemState _skillChanged(int skillIndex, int newValue, bool currentChanged) {
final skills = <CharacterSkill>[];

Expand All @@ -139,7 +166,11 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven
continue;
}

final tuple = _checkProvidedLevels(currentChanged ? newValue : item.currentLevel, currentChanged ? item.desiredLevel : newValue);
final tuple = _checkProvidedLevels(
currentChanged ? newValue : item.currentLevel,
currentChanged ? item.desiredLevel : newValue,
currentChanged,
);
final cl = tuple.item1;
final dl = tuple.item2;

Expand All @@ -150,23 +181,160 @@ class CalculatorAscMaterialsItemBloc extends Bloc<CalculatorAscMaterialsItemEven
if (dl > maxSkillLevel || dl < minSkillLevel) {
return currentState;
}

skills.add(item.copyWith.call(currentLevel: cl, desiredLevel: dl));
final enableTuple = _isSkillEnabled(cl, dl, currentState.currentAscensionLevel, currentState.desiredAscensionLevel);
skills.add(item.copyWith.call(
currentLevel: cl,
desiredLevel: dl,
isCurrentDecEnabled: enableTuple.item1,
isCurrentIncEnabled: enableTuple.item2,
isDesiredDecEnabled: enableTuple.item3,
isDesiredIncEnabled: enableTuple.item4,
));
}

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

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

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

return Tuple2<int, int>(cl, dl);
}

int _getClosestAscensionLevel(int toItemLevel) {
if (toItemLevel <= 0) {
throw Exception('The provided itemLevel = $toItemLevel is not valid');
}

int ascensionLevel = -1;
for (final kvp in itemAscensionLevelMap.entries) {
final temp = kvp.value;
if (temp >= toItemLevel && ascensionLevel == -1) {
ascensionLevel = kvp.key;
}
continue;
}

//if we end up here, that means the provided level is higher than the one in the
//map, so we simple return the highest one available
if (ascensionLevel == -1) {
return itemAscensionLevelMap.entries.last.key;
}

if (toItemLevel == itemAscensionLevelMap.entries.firstWhere((kvp) => kvp.key == ascensionLevel).value) {
return ascensionLevel;
}

return ascensionLevel - 1;
}

int _getItemLevelToUse(int currentAscensionLevel, int currentItemLevel) {
if (currentItemLevel <= 0) {
throw Exception('The provided itemLevel = $currentItemLevel is not valid');
}
if (currentAscensionLevel < 0) {
throw Exception('The provided ascension level = $currentAscensionLevel is not valid');
}

if (currentAscensionLevel == 0) {
return itemAscensionLevelMap.entries.first.value;
}

final currentKvp = itemAscensionLevelMap.entries.firstWhere((kvp) => kvp.key == currentAscensionLevel);
final suggestedAscLevel = _getClosestAscensionLevel(currentItemLevel);

if (currentKvp.key != suggestedAscLevel) {
return currentKvp.value;
}

return currentItemLevel;
}

int _getSkillLevelToUse(int forAscensionLevel, int currentSkillLevel) {
if (forAscensionLevel < 0) {
throw Exception('The provided ascension level = $forAscensionLevel is not valid');
}

if (forAscensionLevel == 0) {
return skillAscensionMap.entries.first.value.first;
}

if (!skillAscensionMap.entries.any((kvp) => kvp.value.contains(currentSkillLevel))) {
throw Exception('The provided skill level = $currentSkillLevel is not valid');
}

final currentKvp = skillAscensionMap.entries.firstWhere((kvp) => kvp.value.contains(currentSkillLevel));
final newKvp = skillAscensionMap.entries.firstWhere((kvp) => kvp.key == forAscensionLevel);

if (newKvp.key >= currentKvp.key) {
return currentSkillLevel;
}

return newKvp.value.first;
}

List<CharacterSkill> _updateSkills(int currentAscensionLevel, int desiredAscensionLevel) {
final skills = <CharacterSkill>[];

for (final skill in currentState.skills) {
final cSkill = _getSkillLevelToUse(currentAscensionLevel, skill.currentLevel);
final dSkill = _getSkillLevelToUse(desiredAscensionLevel, skill.desiredLevel);
final enableTuple = _isSkillEnabled(cSkill, dSkill, currentAscensionLevel, desiredAscensionLevel);
skills.add(skill.copyWith.call(
currentLevel: cSkill,
desiredLevel: dSkill,
isCurrentDecEnabled: enableTuple.item1,
isCurrentIncEnabled: enableTuple.item2,
isDesiredDecEnabled: enableTuple.item3,
isDesiredIncEnabled: enableTuple.item4,
));
}

return skills;
}

//TODO: FIX THIS METHOD
bool _canSkillBeIncreased(int skillLevel, int maxAscensionLevel, bool inclusive) {
final entry = skillAscensionMap.entries.firstWhere((kvp) => kvp.value.contains(skillLevel));
final isNotTheLast = entry.value.last != skillLevel;
if (inclusive) {
return entry.key <= maxAscensionLevel && isNotTheLast;
}
return entry.key < maxAscensionLevel && isNotTheLast;
}

Tuple4<bool, bool, bool, bool> _isSkillEnabled(
int currentLevel,
int desiredLevel,
int currentAscensionLevel,
int desiredAscensionLevel,
) {
final currentDecEnabled = currentLevel != minSkillLevel;
final currentIncEnabled = currentLevel != maxSkillLevel &&
_canSkillBeIncreased(currentLevel, currentAscensionLevel, skillAscensionMap.entries.first.key != currentAscensionLevel);

final desiredDecEnabled = desiredLevel != minSkillLevel;
final desiredIncEnabled = desiredLevel != maxSkillLevel &&
_canSkillBeIncreased(desiredLevel, desiredAscensionLevel, skillAscensionMap.entries.first.key != desiredAscensionLevel);

return Tuple4<bool, bool, bool, bool>(currentDecEnabled, currentIncEnabled, desiredDecEnabled, desiredIncEnabled);
//Current
// incrementIsDisabled: currentLevel == CalculatorAscMaterialsItemBloc.maxSkillLevel,
// decrementIsDisabled: currentLevel == CalculatorAscMaterialsItemBloc.minSkillLevel,

//Desired
// incrementIsDisabled: desiredLevel == CalculatorAscMaterialsItemBloc.maxSkillLevel,
// decrementIsDisabled: desiredLevel == CalculatorAscMaterialsItemBloc.minSkillLevel,
}
}
14 changes: 14 additions & 0 deletions lib/domain/app_constants.dart
Expand Up @@ -11,6 +11,9 @@ const languagesMap = {
// AppLanguageType.french: LanguageModel('fr', 'FR'),
};

//key = ascension level
//value = item level
//Remember that you can be level 80 but that doesn't mean you have ascended to level 6
const itemAscensionLevelMap = {
1: 20,
2: 40,
Expand All @@ -20,6 +23,17 @@ const itemAscensionLevelMap = {
6: 80,
};

//key = ascension level
//value = the possible skill upgrades level
const skillAscensionMap = {
1: [1],
2: [2],
3: [3, 4],
4: [5, 6],
5: [7],
6: [8, 9, 10]
};

const characterExp = [
ItemExperience.forCharacters(1, 1000, 0),
ItemExperience.forCharacters(2, 1325, 1000),
Expand Down
Expand Up @@ -9,5 +9,9 @@ abstract class CharacterSkill with _$CharacterSkill {
@required String name,
@required int currentLevel,
@required int desiredLevel,
@required bool isCurrentIncEnabled,
@required bool isCurrentDecEnabled,
@required bool isDesiredIncEnabled,
@required bool isDesiredDecEnabled,
}) = _CharacterSkill;
}
Expand Up @@ -59,7 +59,11 @@ class AddEditItemBottomSheet extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text(s.level, textAlign: TextAlign.center, style: theme.textTheme.subtitle2.copyWith(fontWeight: FontWeight.bold)),
Text(
s.level,
textAlign: TextAlign.center,
style: theme.textTheme.subtitle2.copyWith(fontWeight: FontWeight.bold),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Expand All @@ -83,6 +87,10 @@ class AddEditItemBottomSheet extends StatelessWidget {
name: e.name,
currentLevel: e.currentLevel,
desiredLevel: e.desiredLevel,
isCurrentDecEnabled: e.isCurrentDecEnabled,
isCurrentIncEnabled: e.isCurrentIncEnabled,
isDesiredDecEnabled: e.isDesiredDecEnabled,
isDesiredIncEnabled: e.isDesiredIncEnabled,
))
.toList()
],
Expand Down
Expand Up @@ -26,12 +26,10 @@ class AscensionLevel extends StatelessWidget {
),
onPressed: () {
final newValue = i == CalculatorAscMaterialsItemBloc.minAscensionLevel && isSelected ? 0 : i;
final bloc = context.read<CalculatorAscMaterialsItemBloc>();
if (isCurrentLevel) {
bloc.add(CalculatorAscMaterialsItemEvent.currentLevelChanged(newValue: newValue));
} else {
bloc.add(CalculatorAscMaterialsItemEvent.desiredLevelChanged(newValue: newValue));
}
final event = isCurrentLevel
? CalculatorAscMaterialsItemEvent.currentAscensionLevelChanged(newValue: newValue)
: CalculatorAscMaterialsItemEvent.desiredAscensionLevelChanged(newValue: newValue);
context.read<CalculatorAscMaterialsItemBloc>().add(event);
},
);
widgets.add(button);
Expand Down

0 comments on commit 36b4cc7

Please sign in to comment.