getFusionsTo method
Returns a List of Fusion
s that fuses persona
Implementation
List<Fusion> getFusionsTo(Persona persona) {
// Can't fuse rares
if (persona.rare) return [];
// Special fusion
if (persona.special) return _getSpecialFusionsTo(persona);
// List of combos that results the same arcana
final List<List<Arcana>> resultingArcanas = persona.arcana.resultingCombos;
// List of fusions
final List<Fusion> fusions = <Fusion>[];
// Iterate over all combos
for (final List<Arcana> resultingArcana in resultingArcanas) {
// Down-rank fusion + rare fusions
if (resultingArcana.containsDuplicate()) {
final List<Persona> list1 = _repository.personas
.where((Persona p) => p.arcana == resultingArcana[0])
.toList();
list1.combinations2((first, second) {
final Persona? fusedPersona = fuse(first, second);
if (fusedPersona != null) {
fusions.add(Fusion(source: [first, second], target: fusedPersona));
}
});
for (final Persona rare in _repository.getRarePersonas) {
for (final Persona normal in list1) {
final Persona? fusedPersona = fuse(rare, normal);
if (fusedPersona != null) {
fusions.add(Fusion(source: [rare, normal], target: fusedPersona));
}
}
}
} else {
final List<Persona> list1 = _repository.personas
.where((Persona p) => p.arcana == resultingArcana[0])
.toList();
final List<Persona> list2 = _repository.personas
.where((Persona p) => p.arcana == resultingArcana[1])
.toList();
for (final Persona p1 in list1) {
for (final Persona p2 in list2) {
final Persona? fusedPersona = fuse(p1, p2);
if (fusedPersona != null) {
fusions.add(Fusion(source: [p1, p2], target: fusedPersona));
}
}
}
}
}
return fusions.where((element) => element.target == persona).toList()
..sort();
}