code: def apply_tile_groups(self, tile_groups):
          
          self_increase_types = ('r', 'g', 'b', 'y', 'x', 'm', 'h', 'c')
          attack_types = ('s', '*')
          total_attack = 0
          for tile_group in tile_groups:
              group_type = None
              type_count = 0
              type_multiplier = 1
              for tile in tile_group:
                  # try to get the group type
                  if not group_type:
                      # try to set the group type to a non-wildcard type
                      if tile._type in self_increase_types:
                          group_type = tile._type
                      elif tile._type in attack_types:
                          group_type = 's'  # always use base skull
                  # handle special case of wildcard
                  if tile.is_wildcard():
                      type_multiplier *= int(tile._type)
                      continue  # done with this tile
                  # handle special case of skullbomb / skull
                  elif tile.is_skullbomb():
                      total_attack += 5
                      continue
                  elif tile.is_skull():
                      total_attack += 1
                      continue
                  # handle standard case of normal tiles
                  else:
                      type_count += 1
              if group_type is None:
                  continue  # ignore this group. could be all wildcards or empty
              # adjust self value
              if type_count:
                  new_value = type_count * type_multiplier
                  original = getattr(self, group_type)
                  setattr(self, group_type, original + new_value)
          # return any attack value
          return total_attack
docs: Increase mana, xp, money, anvils and scrolls based on tile groups.