docs: def character_delta(self, char, *, store=True):
          """Return a dictionary of changes to ``char`` since previous call."""
          ret = self.character_stat_delta(char, store=store)
          nodes = self.character_nodes_delta(char, store=store)
          chara = self._real.character[char]
          if nodes:
              ret['nodes'] = nodes
          edges = self.character_portals_delta(char, store=store)
          if edges:
              ret['edges'] = edges
          avs = self.character_avatars_delta(char, store=store)
          if avs:
              ret['avatars'] = avs
          rbs = self.character_rulebooks_delta(char, store=store)
          if rbs:
              ret['rulebooks'] = rbs
          nrbs = self.character_nodes_rulebooks_delta(char, store=store)
          if nrbs:
              for node, rb in nrbs.items():
                  if node not in chara.node:
                      continue
                  ret.setdefault('node_val', {}).setdefault(node, {})['rulebook'] = rb
          porbs = self.character_portals_rulebooks_delta(char, store=store)
          if porbs:
              for orig, dests in porbs.items():
                  if orig not in chara.portal:
                      continue
                  portals = chara.portal[orig]
                  for dest, rb in dests.items():
                      if dest not in portals:
                          continue
                      ret.setdefault('edge_val', {}).setdefault(orig, {}).setdefault(dest, {})['rulebook'] = rb
          nv = self.character_nodes_stat_delta(char, store=store)
          if nv:
              ret['node_val'] = nv
          ev = self.character_portals_stat_delta(char, store=store)
          if ev:
              ret['edge_val'] = ev
          return ret