     nextThing = =>
       if @things.length
         t = @things.shift()
-        animal = t instanceof Animal
-        for other in fresh
-          @trig t, other if animal || other instanceof Animal
-        fresh.push t
+        @addToCollection t, fresh
         setTimeout nextThing, 0
       else
         @things = fresh

    createCreatures Carnivore, 'carnivores'
  addThing: (thing) ->
    thing.id = @idBase += 1
    animal = thing instanceof Animal
    for t in @things
      @trig thing, t if animal || t instanceof Animal
    @things.push thing
  # do all recalculations without yielding any time to browser events
  fastRecalculate: ->
    fresh = []
    setTimeout(
      =>
        t.clean() for t in @things
        for t in @things
          animal = t instanceof Animal
          for other in fresh
            @trig t, other if animal || other instanceof Animal
          fresh.push t
        @things = fresh
        @afterGeometry()
      0

    ti = t.id
    oi = o.id
    t1 = t.others[oi]
    @geoPool.push t1 if t1
    tp = @tp(base, height, @maxDistance)
    t.others[oi] = tp
    if o instanceof Animal
      t2 = o.others[ti]
      @geoPool.push t2 if t2
      o.others[ti] = @geo.opposite(tp)
  # finds the things within a particular distance of a reference thing and within a certain
  # wedge around the direction of the things movement
  # if the thing has a visual angle of 1, or the thing is motionless, all things within the distance are returned
