public int GetSimilarityTo(AffinityMap other) { int total = 0; foreach (var aspect in _affinities.Keys) { int otherAffinity = other.GetAffinity(aspect); if (otherAffinity != 0) { total += (GetAffinity(aspect) * other.GetAffinity(aspect)) / 2; } } return(total); }
public AffinityMap CombineWith(AffinityMap other) { AffinityMap combined = new AffinityMap(_rand); foreach (var aspect in _affinities.Keys) { int otherAffinity = other.GetAffinity(aspect); if (otherAffinity != 0) { int combinedVal = CombineAffinities(GetAffinity(aspect), other.GetAffinity(aspect)); if (combinedVal != 0) { combined.SetAffinity(aspect, combinedVal); } } } return(combined); }
public AffinityMap GetAffinitiesForLandmass(Landmass landmass) { if (!Landmasses.Contains(landmass)) { throw new KeyNotFoundException("Tried to get affinities for a landmass that is not in this HexMap."); } if (landmass.Affinities == null) { var totalAffinityScore = new Dictionary <string, int>(); foreach (Coords coords in landmass.Hexes) { Hex hex = GetHexAt(coords); AffinityMap affinities = hex.Affinities; foreach (var aspect in affinities.AspectList) { if (!totalAffinityScore.ContainsKey(aspect)) { totalAffinityScore[aspect] = 0; } totalAffinityScore[aspect] += affinities.GetAffinity(aspect); } } AffinityMap newAffinityMap = new AffinityMap(_rand); foreach (var aspect in totalAffinityScore.Keys) { int score = totalAffinityScore[aspect]; int affinity = score / landmass.TotalHexes; // don't allow 0 here; just weak affinities if (affinity == 0) { affinity = (score > 0) ? 1 : -1; } newAffinityMap.SetAffinity(aspect, affinity); } landmass.Affinities = newAffinityMap; } return(landmass.Affinities); }