public boolean actionPerform(Actor actor, Venue venue) {
    //
    //  Firstly, calculate the effectiveness of the actor's own performance-
    float effect = 0 ;
    for (Skill s : PERFORM_SKILLS[type]) {
      final int DC = s == PERFORM_SKILLS[type][0] ? MODERATE_DC : ROUTINE_DC ;
      final boolean success = actor.traits.test(s, DC - checkBonus, 1) ;
      if (success) effect++ ;
      else if (Rand.yes()) effect-- ;
    }
    performValue = Visit.clamp(performValue + effect, 0, 10) ;
    timeSpent++ ;
    //
    //  The actor may be entitled to some of the benefits of recreation in the
    //  process, assuming they have a decent relationship with the audience-
    final Recreation r = new Recreation(actor, venue, type) ;
    final Batch <Recreation> audience = audienceFor(venue, this) ;
    
    if (audience.size() > 0) {
      final Actor notice = ((Plan) Rand.pickFrom(audience)).actor() ;
      if (Rand.num() < actor.mind.relationValue(notice)) {
        super.actionRelax(actor, venue) ;
      }
    }
    
    return true ;
  }