getFusionsTo method

List<Fusion> getFusionsTo(
  1. Persona persona
)

Returns a List of Fusions 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();
}