protected Behaviour getNextStep() {
    if (stage >= STAGE_DONE) return null ;
    if (type != TYPE_CONTACT && ! canTalk(other)) {
      abortBehaviour() ;
      return null ;
    }
    
    if (starts == actor && stage == STAGE_INIT) {
      final Action greeting = new Action(
        actor, other,
        this, "actionGreet",
        Action.TALK, "Greeting "
      ) ;
      greeting.setProperties(Action.RANGED) ;
      return greeting ;
    }
    
    if (stage == STAGE_CHAT) {
      Actor chatsWith = ((Dialogue) Rand.pickFrom(sides())).actor ;
      if (chatsWith == actor) chatsWith = other ;
      final Action chats = new Action(
        actor, chatsWith,
        this, "actionChats",
        Action.TALK_LONG, "Chatting with "
      ) ;
      setLocationFor(chats) ;
      return chats ;
    }
    
    if (stage == STAGE_BYE) {
      final Action farewell = new Action(
        actor, other,
        this, "actionFarewell",
        Action.TALK, "Saying farewell to "
      ) ;
      farewell.setProperties(Action.RANGED) ;
      return farewell ;
    }
    
    return null ;
  }